在以下代码中:struct Struct.Test
的类型是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()
}
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
在类型为T
的方法集中,则T.M
是一个可作为常规函数调用的函数,该函数具有与M
相同的参数,并以作为方法接收器的附加参数为前缀。
方法表达式为";应用";在类型上;应用";在值上。方法表达式产生的函数值包含接收器类型(作为第一个参数(,方法值不包含(接收器保存在内部(。
因此,在您的情况下,方法表达式将是(*Struct).Test
(注意指针:Test()
具有指针接收器(,它是一个类型为func(Struct)
的函数。它可以这样使用/调用:
f2 := (*Struct).Test
f2(&t)
再次输出Struct
,请在Go Playground上尝试。