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