使用結構體設定器:了解指標的重要性
在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中文網其他相關文章!