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

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

DDD
DDD原創
2024-12-16 11:36:18795瀏覽

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

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