首页 >后端开发 >Golang >如何正确追加到 Go 结构中的切片?

如何正确追加到 Go 结构中的切片?

Susan Sarandon
Susan Sarandon原创
2024-12-13 01:29:14203浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn