为什么结构函数与普通函数的类型相同

  • 本文关键字:函数 类型 结构 go struct
  • 更新时间 :
  • 英文 :


在以下代码中: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上尝试。

最新更新