Go - 附加到結構體中的切片
在 Go 中,附加到結構體中的切片需要仔細注意變數引用。在使用結構體中的切片時,這可能會變得令人困惑,尤其是當接收結構體的方法是指標接收器時。
問題
考慮以下程式碼:
package main import "fmt" type MyBoxItem struct { Name string } type MyBox struct { Items []MyBoxItem } func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { return append(box.Items, item) } func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} // Initialize box with an empty slice AddItem(box, item1) // This is where the problem arises fmt.Println(len(box.Items)) }
問題出現在對 AddItem 方法的呼叫中。當呼叫 AddItem(box, item1) 方法而不是 box.AddItem(item1) 時,會建立 box 結構的新副本,而不是修改原始結構。
解
要解決此問題,請將AddItem 方法的結果分配回原始切片結構體:
func (box *MyBox) AddItem(item MyBoxItem) { box.Items = append(box.Items, item) }
透過這樣做,AddItem 方法中對切片所做的變更將反映在結構體的原始切片欄位中。
修訂的主函數
使用更新的AddItem 方法,修正後的main 函數應該是:
func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} box.AddItem(item1) // Call the method correctly fmt.Println(len(box.Items)) }
現在,輸出將正確列印Items 切片的長度,添加項目後應該為1。
以上是如何正確追加到 Go 結構中的切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!