关于反射:为什么在Go中的接口{}中放置指针会反映丢失类型的名称?

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方法的文档所说,未命名的类型将返回空字符串:

Name returns the type's name within its package.
It returns an empty string for unnamed types.

h的类型是一个未命名的指针类型,其元素类型是命名的结构类型Foo类型:

1
2
v := reflect.TypeOf(h)
fmt.Println(v.Elem().Name()) // prints"Foo"

如果您需要这样复杂的未命名类型的标识符,请使用String方法:

1
fmt.Println(v.String()) // prints"*main.Foo"