下面代碼中: 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 關注
- 124 瀏覽
添加回答
舉報
0/150
提交
取消
