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