无法追加到方法外部的结构体切片
在 Go 中使用切片时,追加到以下切片时会出现一个常见问题:结构体的属性。在某些情况下,尽管直接在结构体上执行正确,此操作可能会失败。
考虑以下示例:
type Test1 struct { all []int } func (c Test1) run() []int { for i := 0; i < 2; i++ { c.all = append(c.all, i) } return c.all }
这里,代码成功附加到结构体中的所有切片Test1 结构的 run 方法。但是,如果此方法调用另一个方法,则追加操作会失败。
例如:
type Test3 struct { all []int } func (c Test3) run() []int { c.combo() return c.all } func (c Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) } }
在这种情况下,Test3.combo 方法尝试追加到所有切片,但失败。原因是 Go 按值传递值,这意味着调用 c.combo() 时会创建 Test3 结构体的副本。
副本在其自己的切片上运行,当方法返回时,相关的更改将被丢弃。因此,当 Test3.run 尝试返回 c.all 时,它会返回一个空切片,因为副本的修改版本丢失了。
此问题的解决方案是为组合方法使用指针接收器:
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) } }
使用指针接收器可确保该方法在原始 Test3 结构上运行,从而允许在组合方法返回时保留在组合方法中所做的更改。
以上是为什么在 Go 中从另一个方法调用时附加到结构体切片不起作用?的详细内容。更多信息请关注PHP中文网其他相关文章!