下面代码中: 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 关注
- 99 浏览
添加回答
举报
0/150
提交
取消