Why does putting a pointer in an interface{} in Go cause reflect to lose the name of the type?
下面的示例显示了当您反映设置为对象(G)和指向所述对象(H)的指针的接口时所发生的情况。这是按设计的吗?我应该期望我的数据类型丢失,或者更确切地说,当我将指针放在接口中时,我不能取回数据类型的名称吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package main import"fmt" import"reflect" type Foo struct { Bar string } func main() { f := Foo{Bar:"FooBar"} typeName := reflect.TypeOf(f).Name() fmt.Printf("typeName %v ", typeName) var g interface{} g = f typeName = reflect.TypeOf(g).Name() fmt.Printf("typeName %v ", typeName) var h interface{} h = &f typeName = reflect.TypeOf(h).Name() fmt.Printf("typeName %v ", typeName) } |
输出:
1 2 3 | typeName Foo typeName Foo typeName |
号
也在:
http://play.golang.org/p/2qubodxhfx
正如
Name returns the type's name within its package.
It returns an empty string for unnamed types.
号
1 2 | v := reflect.TypeOf(h) fmt.Println(v.Elem().Name()) // prints"Foo" |
如果您需要这样复杂的未命名类型的标识符,请使用
1 | fmt.Println(v.String()) // prints"*main.Foo" |
号