首頁 > 後端開發 > Golang > 如何正確追加到 Go 結構中的切片?

如何正確追加到 Go 結構中的切片?

Susan Sarandon
發布: 2024-12-13 01:29:14
原創
202 人瀏覽過

How to Correctly Append to a Slice within a Go Struct?

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

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