首页 > 后端开发 > Golang > 为什么修改 Go 范围循环中的值不会改变原始数组?

为什么修改 Go 范围循环中的值不会改变原始数组?

Susan Sarandon
发布: 2024-12-18 04:04:09
原创
736 人浏览过

Why Doesn't Modifying Values in Go's Range Loop Change the Original Array?

范围引用代替值

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板