首页 >后端开发 >Golang >为什么在 Go 结构方法中附加到切片并不总是有效?

为什么在 Go 结构方法中附加到切片并不总是有效?

DDD
DDD原创
2025-01-03 10:15:39519浏览

Why Doesn't Appending to a Slice in a Go Struct Method Always Work?

理解 Go 中的切片操作

在 Go 中,当将切片作为结构体的属性进行操作时,考虑值传递至关重要。在某些情况下,附加到方法内的切片可能会失败。让我们深入探究一下这背后的原因并探讨解决方案。

Go 结构中的值传递

在 Go 中,一切都是按值传递,意味着创建一个副本对于每个传递的值。因此,在方法中对副本进行的任何修改都不会影响原始值。

测试 3:失败的追加尝试

考虑以下代码:

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)
    fmt.Println("Test3 step", i + 1, c.all)
  }
}

当你调用Test3.run()时,看起来c.all没有被修改。这是因为combo()方法对Test3的副本进行操作,并且combo()内所做的任何更改都不会传播回原始值。

解决方案:使用指针接收器

要解决此问题,请为combo() 方法使用指针接收器:

func (c *Test3) combo() {
  for i := 0; i < 2; i++ {
    c.all = append(c.all, i)
    fmt.Println("Test3 step", i + 1, c.all)
  }
}

通过使用指针接收者,您确保combo() 修改原始Test3 值,并且该更改会在该方法返回时反映出来。

以上是为什么在 Go 结构方法中附加到切片并不总是有效?的详细内容。更多信息请关注PHP中文网其他相关文章!

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