首页 > 后端开发 > Golang > 为什么在 Go Range 循环中修改结构体值不会改变原始切片?

为什么在 Go Range 循环中修改结构体值不会改变原始切片?

Barbara Streisand
发布: 2024-12-20 19:05:11
原创
314 人浏览过

Why Doesn't Modifying Struct Values in a Go Range Loop Change the Original Slice?

为什么范围类型结构中的值无法修改

在 Go 中,范围类型结构就像切片一样,创建一个底层数据的视图而不是副本。在某个范围内迭代时,对迭代变量所做的任何修改仅影响该特定视图,而不影响原始数据。

要理解这一点,请考虑以下代码片段:

type myStruct struct {
    Name  string
    Count int
}

func main() {
    chartRecords := []myStruct{}
    for i := 0; i < 4; i++ {
        n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)}
        chartRecords = append(chartRecords, n)
    }

    for _, elem := range chartRecords {
        elem.Count = 0
        fmt.Println(elem)
    }

    fmt.Println(chartRecords)
}
登录后复制

这代码片段迭代chartRecords的范围,将每个迭代变量的Count字段修改为0,并打印修改后的变量。然而,当打印原始的chartRecords切片时,它显示Count字段值没有改变。

这是因为带有范围子句的for循环创建了范围中每个元素的副本。对副本进行的修改不会影响原始元素。要修改原始元素,您需要通过访问它们在切片中的索引来显式更新它们。例如:

func main() {
    chartRecords := []myStruct{}
    for i := 0; i < 4; i++ {
        n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)}
        chartRecords = append(chartRecords, n)
    }

    for i, elem := range chartRecords {
        chartRecords[i] = myStruct{Count: 0, Name: elem.Name}
    }

    fmt.Println(chartRecords)
}
登录后复制

在此示例中,带有 range 子句的 for 循环用于迭代 ChartRecords 的范围。对于每次迭代,索引用于访问切片中的原始元素,并更新元素的值。这种方法确保修改反映在原始的图表记录切片中。

以上是为什么在 Go Range 循环中修改结构体值不会改变原始切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

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