帶有指標接收器的Golang 方法
當嘗試透過方法修改實例的值時,理解指標的概念至關重要接收器。在此範例中,SetSomeField 方法未如預期運作,因為其接收器不是指標類型。
為了修正此問題,我們修改SetSomeField 方法以接受指標接收器,如下所示:
func (i *Implementation) SetSomeField(newValue string) { ... }
但是,此變更引入了一個新問題:該結構體不再實現該接口,因為GetSomeField 方法仍然具有值receive.
解決方案在於在實現接口時使用指向結構體的指針。透過這樣做,我們使該方法能夠修改實際實例而不建立副本。以下是修改後的程式碼:
type IFace interface { SetSomeField(newValue string) GetSomeField() string } type Implementation struct { someField string } func (i *Implementation) GetSomeField() string { return i.someField } func (i *Implementation) SetSomeField(newValue string) { i.someField = newValue } func Create() *Implementation { return &Implementation{someField: "Hello"} } func main() { var a IFace a = Create() a.SetSomeField("World") fmt.Println(a.GetSomeField()) }
在此更新的程式碼中,Create 函數傳回一個指向實作結構的指針,該結構實作了 IFace 介面。因此,IFace 類型的變數可以引用指向 Implement 結構體的指針,從而允許 SetSomeField 方法修改其值。
以上是為什麼除非我使用指標接收器,否則我的 Go 方法不會修改實例值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!