Go - 附加到結構體中的切片
在Go 中,切片是引用類型,這意味著它們保存對底層的引用大批。如果將元素附加到結構體中的切片,並且不將結果指派回切片,則函數傳回時,變更將不會保留。
請考慮以下程式碼:
type MyBoxItem struct { Name string } type MyBox struct { Items []MyBoxItem } func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { return append(box.Items, item) }
這裡,AddItem 方法會取得一個項目並將其附加到框結構中的項目切片中。但是,該方法不會將結果指派回 Items 切片,這表示方法在傳回時切片不會被修改。
要解決此問題,您需要將追加操作的結果指派回切片。您可以透過修改 AddItem 方法來實現此目的,如下所示:
func (box *MyBox) AddItem(item MyBoxItem) { box.Items = append(box.Items, item) }
現在,當您呼叫 AddItem 方法時,切片將在結構內更新。您可以透過在Items 切片上呼叫len 函數來驗證這一點:
item1 := MyBoxItem{Name: "Test Item 1"} item2 := MyBoxItem{Name: "Test Item 2"} items := []MyBoxItem{} box := MyBox{items} box.AddItem(item1) fmt.Println(len(box.Items)) // Output: 1
請注意,AddItem 方法是為*MyBox 類型定義的,這意味著您必須將其呼叫為box.AddItem( item1) ,將指向盒結構的指標作為參數傳遞。
以上是為什麼在不重新分配的情況下附加到 Go 結構中的切片不會持續存在?的詳細內容。更多資訊請關注PHP中文網其他相關文章!