为了账号安全,请及时绑定邮箱和手机立即绑定

为什么结构函数和普通函数是同一类型

为什么结构函数和普通函数是同一类型

Go
白衣染霜花 2023-02-14 18:24:06
下面代码中: 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在类型的方法集中Tx.M则称为方法值方法值x.M是一个函数值,可以使用与 的方法调用相同的参数进行调用x.M表达式x在方法值的求值过程中被求值并保存;然后将保存的副本用作任何调用的接收者,这些调用可能会在以后执行。

方法x.Test()没有参数,x.Test函数也没有参数。接收器x在内部保存并在您x.Test稍后调用函数值时使用。它的类型将是func(),因此类型f也是func(),您可以为其分配任何类型也为 的值func()

不要混淆方法值和方法表达式

如果M在 type 的方法集中TT.M是一个可以作为常规函数调用的函数,其参数与附加参数前缀相同,M该附加参数是方法的接收者。

方法表达式“应用于”类型而方法值“应用于”。方法表达式导致函数值包含接收者类型(作为第一个参数),方法值不包含(接收者在内部保存)。

因此,在您的情况下,方法表达式将是(*Struct).Test(注意指针:Test()具有指针接收器),并且它是 type 的函数func(Struct)。它可以这样使用/调用:

f2 := (*Struct).Test
f2(&t)

再次输出,在Go PlaygroundStruct上尝试。


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号