下面代码中: type of struct Struct.Testis void func(),函数可以获取 中的所有参数,为什么和 的Struct t类型相同Struct.func()func()type Struct struct { Val string}func (t *Struct) Test() { println(t.Val)}func main() { t := Struct{ Val: "Struct", } f := t.Test f() f = func() { println("Hello world!") } f()}
1 回答
狐的传说
TA贡献1804条经验 获得超3个赞
t.Test是一个方法值:
如果表达式
x具有静态类型T并且M在类型的方法集中T,x.M则称为方法值。方法值x.M是一个函数值,可以使用与 的方法调用相同的参数进行调用x.M。表达式x在方法值的求值过程中被求值并保存;然后将保存的副本用作任何调用的接收者,这些调用可能会在以后执行。
方法x.Test()没有参数,x.Test函数也没有参数。接收器x在内部保存并在您x.Test稍后调用函数值时使用。它的类型将是func(),因此类型f也是func(),您可以为其分配任何类型也为 的值func()。
不要混淆方法值和方法表达式:
如果
M在 type 的方法集中T,T.M是一个可以作为常规函数调用的函数,其参数与附加参数前缀相同,M该附加参数是方法的接收者。
方法表达式“应用于”类型,而方法值“应用于”值。方法表达式导致函数值包含接收者类型(作为第一个参数),方法值不包含(接收者在内部保存)。
因此,在您的情况下,方法表达式将是(*Struct).Test(注意指针:Test()具有指针接收器),并且它是 type 的函数func(Struct)。它可以这样使用/调用:
f2 := (*Struct).Test f2(&t)
再次输出,在Go PlaygroundStruct上尝试。
- 1 回答
- 0 关注
- 139 浏览
添加回答
举报
0/150
提交
取消
