猿问

为什么 typeof(method) 不返回 reflect.Method 实例?

假设我有一个 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并且显然我无法访问Getfunc 我从“属于”结构中提取类型信息的信息Foo,即接收器是类型的Foo,它甚至没有出现在参数中。


我想这是故意的,我错过了一些关于函数的基本知识,这些函数使语言作者丢弃了应用于方法引用的 typeof 操作的接收者信息。

我有两个问题:

  1. 我是对的吗,没有办法通过TypeOf上面的调用在代码段中获取接收者类型?

  2. 如果我想将有关方法的反射信息传递给一些旨在分析函数和相关接收器(即本质上是方法)的代码,我有哪些选择?

尝试自己回答第二个问题,根据我在官方文档中看到的内容,看起来我唯一的选择是传递 TypeOf(receiver) 和 TypeOf(receiver.method) 或 TypeOf(receiver) 和接收者方法的名称.


HUX布斯
浏览 119回答 1
1回答

肥皂起泡泡

你拥有的是一个方法值:obj.Get。方法值是一个函数,其签名与没有接收者类型的方法相同:如果表达式x具有静态类型T并且M在类型的方法集中T,x.M则称为方法值。方法值x.M是一个函数值,可以使用与 的方法调用相同的参数x.M进行调用。表达式 x 在方法值的求值过程中被求值并保存;然后将保存的副本用作任何调用的接收者,这些调用可能会在以后执行。如果您使用方法表达式(而不是方法值),接收者类型将“显示”在参数列表中(它总是第一个):fmt.Println(reflect.TypeOf((*Foo).Get))输出(在Go Playground上尝试):func(*main.Foo, int, string) (string, error)方法表达式:如果M在type 的方法集中T,T.M是一个可以作为常规函数调用的函数,其参数与附加参数前缀相同,M 该附加参数是方法的接收者。
随时随地看视频慕课网APP

相关分类

Go
我要回答