假设我有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/

    10-12 00:36
    查看更多