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