Golang range解析

目录

文章目录

正文

golang中的range是一个很常用的功能,可以遍历一个数组,切片等等,但是使用过程需要注意一个细节。
先举个栗子:

package main

import (
    "fmt"
)

type Foo struct {
    Bar string
}

func main() {
    list := []Foo{Foo{"bar1"}, Foo{"bar2"}, Foo{"bar3"}}
    for i, v := range list {
        v.Bar = "change" + string(i)
    }
    fmt.Println(list)
}

我们期望的结果是

[{change1} {change2} {change3}]

但是实际输出的结果是

[{bar1} {bar2} {bar3}]

为什么没有改变? 其实 for range 中的 v 是一个数组元素值的拷贝, 而不是数组元素本身。所以,修改数组元素需要使用下标进行修改。栗子中 for range 修改成

for i, _ := range list {
    list[i].Bar = "change" + string(i)
}

小考题:

package main

import (
    "fmt"
)

func main() {
    a := []int{1, 2, 3}
    for _, v := range a {
        fmt.Println(&v)
    }
}

上面代码每次输出是否是一样?
答案:是一样的。
解析:for range 中的 v 这个副本只会初始化一次。
好比

var v int
v=a
v=b
v=c
v的地址始终不变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值