首页 >后端开发 >Golang >为什么使用 Go 的 range 关键字修改值失败,数组索引如何提供解决方案?

为什么使用 Go 的 range 关键字修改值失败,数组索引如何提供解决方案?

Susan Sarandon
Susan Sarandon原创
2024-12-27 18:27:15120浏览

Why Does Modifying Values Using Go's `range` Keyword Fail, and How Can Array Indices Provide a Solution?

数组索引在范围值上的用法

在 Go 中将 range 关键字与数组或切片一起使用时,必须了解它返回键和值的副本,而不是原始值引用。在迭代期间尝试修改集合中的值时,此行为可能会导致混乱。

在提供的示例中:

package main

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("--")
    }
}

范围迭代应将字符串“foo”分配给数组中每个元素的字段。但是,当第二个循环打印更新的值时,所有字段仍为空。这是由于 range 的基于复制的语义造成的。

为了在迭代过程中有效修改数组中的值,需要使用数组索引而不是 range 变量:

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for idx, _ := range array {
        array[idx].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

此修改确保索引变量引用数组中的实际元素,从而允许在第二个循环中进行正确的字段更新和正确的输出。

以上是为什么使用 Go 的 range 关键字修改值失败,数组索引如何提供解决方案?的详细内容。更多信息请关注PHP中文网其他相关文章!

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