返回范围引用的地址而不是值
考虑范围语句返回值的副本而不是原始地址的情况。这可能会导致意外的行为,如以下 Go 代码所示:
import "fmt" type MyType struct { field string } func main() { var array [10]MyType for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
在此示例中,目的是修改数组中每个元素的“field”属性。但是,由于 range 语句返回值的副本,因此更改是对本地副本进行的,不会影响原始数组。因此,输出将所有“字段”属性显示为具有默认值。
要解决此问题,您无法在范围循环中返回项目的地址。相反,您应该使用索引迭代数组,如下所示:
func main() { var array [10]MyType for idx, _ := range array { array[idx].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
通过使用索引而不是 for 循环中的值,您可以确保对“field”属性所做的更改反映在原始数组中。
以上是为什么我的 Go Range 循环不修改数组元素?的详细内容。更多信息请关注PHP中文网其他相关文章!