2 回答

TA貢獻1780條經驗 獲得超5個贊
在 Go 類型系統中,使用類型的值接收器定義的方法為 和 定義,即:TT*T
func (v Vertex) Abs() float64 {...}
這適用于 和 。該方法本身始終接收 的副本。v*vv
為 定義的方法僅為 定義,而不為 定義。那是:*T*TT
func (v *Vertex) SetX(newx float64) {v.X=newx}
該方法僅在接收方可尋址時才有效。這是必要的,這樣您就不會編寫丟失數據的代碼。例如:SetX
m:=map[string]Vertex{}
m["a"]=Vertex{}
m["a"].SetX(1) // This fails! m["a"] is not addressable
如果上述情況沒有失敗,則 將設置 的副本,并且效果將丟失,因為更新后的副本不會放回地圖中。SetXm["a"]
回到接口:您的接口由任何實現 的類型實現?;谏厦娴挠懻?,既要實現.AbserAbs() float64Vertex*VertexAbser
假設您定義為:Vertex.Abs
func (v *Vertex) Abs() float64 {...}
然后,僅實現 ,因此:*VertexAbser
abser = v // This would fail
abser = &v // This would work

TA貢獻1831條經驗 獲得超10個贊
首先,在Go中,一切都是按價值傳遞的。
指針按值傳遞 - 使用指針的副本。
切片按值傳遞 - 復制指向基礎數組的指針、長度的整數值和容量的整數值。
接口也按值傳遞 - 使用接口值的副本。
如果你這樣想,它會有所幫助。
現在,讓我們關注接口:
接口值由兩部分組成:
指向接口表的指針
指向實際值的指針
因此,當您傳遞接口時,您實際上是在復制兩個指針。
現在,要使類型滿足接口,它需要具有接口所需的方法。如果任何方法使用指針接收器(如您的示例中所示),那么您將需要一個指向該值的指針來滿足接口,這就是為什么您需要獲取它的地址。func (v *Vertex) Abs() float64 {...}
假設沒有一個方法需要指針接收器(比如說)。然后,您不需要指定地址,因為您只需傳遞它而不獲取其地址。func (v Vertex) Abs() float64 {...}
我希望這能回答你的問題。
- 2 回答
- 0 關注
- 87 瀏覽
添加回答
舉報