范围引用代替值
在 Go 中,range 关键字迭代序列(例如数组或切片)并提供访问每个元素的键(索引)和值。但是,出于性能原因,range 关键字对原始值的 副本 进行操作。这意味着对 range 返回的值所做的任何修改都不会反映在原始数组中。
示例
考虑以下代码:
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType // Attempting to modify a value returned by range for _, e := range array { e.field = "foo" } // Printing the values after the range loop for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
运行此代码将为所有元素打印“000000”,因为应用了第一个范围循环内对 e.field 所做的修改到副本,并且不影响数组中的原始值。
解决方案
要使用范围循环修改数组的值,您需要使用数组索引而不是range返回的值。这可以通过在范围循环中使用 _ 占位符捕获索引来实现。
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType // Using the array index to modify values for idx, _ := range array { array[idx].field = "foo" } // Printing the values after the range loop for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
此修改后的代码将成功更改数组中所有元素的字段值,并为每个元素打印“foo”元素。
以上是为什么修改 Go 范围循环中的值不会改变原始数组?的详细内容。更多信息请关注PHP中文网其他相关文章!