首頁 >後端開發 >Golang >為什麼除非我使用指標接收器,否則我的 Go 方法不會修改實例值?

為什麼除非我使用指標接收器,否則我的 Go 方法不會修改實例值?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-08 22:11:12291瀏覽

Why Doesn't My Go Method Modify the Instance Value Unless I Use a Pointer Receiver?

帶有指標接收器的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn