亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么結構函數和普通函數是同一類型

為什么結構函數和普通函數是同一類型

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 的方法集中T,T.M是一個可以作為常規函數調用的函數,其參數與附加參數前綴相同,M該附加參數是方法的接收者。

方法表達式“應用于”類型,而方法值“應用于”。方法表達式導致函數值包含接收者類型(作為第一個參數),方法值不包含(接收者在內部保存)。

因此,在您的情況下,方法表達式將是(*Struct).Test(注意指針:Test()具有指針接收器),并且它是 type 的函數func(Struct)。它可以這樣使用/調用:

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

再次輸出,在Go PlaygroundStruct上嘗試。


查看完整回答
反對 回復 2023-02-14
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號