实例代码:
type struct MsgData{}
func main() {
msg := &MsgData{}
funcTyp := reflect.TypeOf(msg)
fmt.Println("funcTyp.Name = ", funcTyp.Name())
fmt.Println("funcTyp.Kind = ", funcTyp.Kind())
funcTyp = funcTyp.Elem()
fmt.Println("funcTyp.Name = ", funcTyp.Name())
fmt.Println("funcTyp.Kind = ", funcTyp.Kind())
}
输出结果:
funcTyp.Name =
funcTyp.Kind = ptr
funcTyp.Name = MsgData
funcTyp.Kind = struct
可以看到 对于 Type类型的funcTyp,直接取Kind时,它的类型为ptr,也就是在反射中所有的指针类型都是ptr,但是当我们想要获取指针背后元素的真正数据类型时就需要使用Elem方法,Elem源码如下(省略了多个case,只关注Pointer):
func (t *rtype) Elem() Type {
switch t.Kind() {
省略。。。
case Pointer:
tt := (*ptrType)(unsafe.Pointer(t))
return toType(tt.elem)
省略。。。
}
panic("reflect: Elem of invalid type " + t.String())
}
可以看到它是把指针类型的保存的地址取出来,然后转换为Type类型。