假设我有Foo结构,其方法定义如下:
type Foo struct {
Name string
}
func (f *Foo) Get(a int, b string) (string, error) {
return f.Name, nil
}
如果我写
obj := &Foo{}
t := reflect.TypeOf(obj.Get)
t.Kind()
返回reflect.Func
,显然我无法访问我从“所属”中提取类型信息到Get
结构的Foo
函数的信息,即接收方是Foo
类型,甚至没有出现在参数中。我想这是故意的,我想念一些有关函数的基本知识,这些函数使语言作者丢弃了应用于方法引用的typeof操作的接收者信息。
我有两个问题:
TypeOf
调用获取代码段中的接收者类型? 尝试自己回答第二个问题,并根据我在官方文档中看到的内容,看来我唯一的选择是传递TypeOf(receiver)和TypeOf(receiver.method)或TypeOf(receiver)以及接收方方法的名称。
最佳答案
如mkopriva所述,您拥有的是一个method value:obj.Get
。方法值是一个函数,其签名与没有接收方类型的方法的签名相同:
如果您使用method expression(而不是方法值),则接收器类型“显示”在参数列表中(始终是第一个):
fmt.Println(reflect.TypeOf((*Foo).Get))
输出(在Go Playground上尝试):
func(*main.Foo, int, string) (string, error)
方法表达式:
查看相关问题:
golang - pass method to function
golang function alias on method receiver
关于go - 为什么typeof(method)不返回reflect.Method实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56143142/