首頁 >後端開發 >Golang >為什麼 Go 結構體設定器需要指標來修改原始結構體?

為什麼 Go 結構體設定器需要指標來修改原始結構體?

Patricia Arquette
Patricia Arquette原創
2024-12-16 04:22:12391瀏覽

Why Do Go Struct Setters Need Pointers to Modify the Original Struct?

使用結構體設定器:了解指標的重要性

在Go 中使用結構體時,使用設定器可以修改結構體的屬性。然而,有時可能無法如預期反映所需的修改。這是由於結構體傳遞到函數的方式所造成的。

在提供的範例程式碼中:

type T struct { Val string }

func (t T) SetVal(s string) {
    t.Val = s
}

func (t *T) SetVal2(s string) {
    (*t).Val = s
}

提供的 SetVal 函數不會如預期修改原始結構體,因為該結構會作為值傳遞到函數中。對此副本進行的修改不會影響原始結構。

或者,SetVal2 函數需要一個指向結構的指針,從而允許它修改原始結構。這是因為 Go 按值傳遞指向結構體的指針,這意味著該函數接收與原始結構體相同的記憶體位置的引用。

要示範此行為,請考慮以下程式碼:

v := T{"abc"}
fmt.Println(v)        // {abc}
v.SetVal("pdq")
fmt.Println(v)        // {abc}
v.SetVal2("xyz")
fmt.Println(v)        // {xyz}

在這個例子中,原來的struct v沒有被SetVal修改,而是被SetVal2修改了。這一點可以從輸出的差異看出。

關鍵要點是,在 Go 中,當對結構使用 setter 時,了解按值傳遞和按指針傳遞之間的區別非常重要。使用指標允許函數修改原始結構,而按值傳遞會在函數內建立結構的副本。

以上是為什麼 Go 結構體設定器需要指標來修改原始結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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