转到结构体的指针的类型反射

问题描述

当我只有一个指向结构的指针时,我在确定结构的类型时遇到了问题。

type TypeA struct {
  Foo string
}

type TypeB struct {
  Bar string
}

我必须实现以下回调:

func Callback(param interface{}) {

}

param可以是*TypeA*TypeB

如何确定param的类型?

reflect.TypeOf(param)似乎不适用于指针。

当我这样做

func Callback(param interface{}) {
  n := reflect.TypeOf(param).Name()
  fmt.Printf(n)
}

输出为空

在此先感谢您的帮助。

解决方法

*TypeA这样的指针类型是 unnamed 类型,因此查询它们的名称将得到一个空字符串。使用Type.Elem()来获取元素类型,并打印其名称:
func Callback(param interface{}) {
    n := reflect.TypeOf(param).Elem().Name()
    fmt.Println(n)
}

测试:

Callback(&TypeA{})
Callback(&TypeB{})

哪个会输出(在Go Playground上尝试):

TypeA
TypeB

另一种选择是使用Type.String()方法:

func Callback(param interface{}) {
    n := reflect.TypeOf(param)
    fmt.Println(n.String())
}

这将输出(在Go Playground上尝试):

*main.TypeA
*main.TypeB

查看相关问题:

using reflection in Go to get the name of a struct

Identify non builtin-types using reflect