首頁 > 後端開發 > Golang > 為什麼在不重新分配的情況下附加到 Go 結構中的切片不會持續存在?

為什麼在不重新分配的情況下附加到 Go 結構中的切片不會持續存在?

DDD
發布: 2024-12-16 11:36:18
原創
793 人瀏覽過

Why Doesn't Appending to a Slice in a Go Struct Persist Without Reassignment?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板