首页 >后端开发 >Golang >为什么在 Go 中从另一个方法调用时附加到结构体切片不起作用?

为什么在 Go 中从另一个方法调用时附加到结构体切片不起作用?

Linda Hamilton
Linda Hamilton原创
2024-12-19 13:08:14280浏览

Why Doesn't Appending to a Struct Slice Work in Go When Called From Another Method?

无法追加到方法外部的结构体切片

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

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