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}]

但是实际输出的结果是

[{test1} {test2} {test3}]

为什么没有改变? 其实 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 只会声明初始化一次,不会每次循环都声明初始化。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,914评论 2 9
  • 1、你每天也焦虑吗? 每天有空的时候都会打开手机里的电子书看几页。因为只有大量的输入才会带来输出。 可是一周一本书...
    刘梦月阅读 783评论 2 0
  • 得到APP最近新上的傅佩荣的西方哲学课中,第二篇《五个问题点燃你的哲学好奇心》中的第一个问题就是--先有鸡,...
    丁向伟VigorDing阅读 1,099评论 1 0
  • 我的目标:两年之内把自己培养成年薪40万的人才! 我的目标:一年内,截止2017年10月25日22:13:42的时...
    请叫我四爷阅读 176评论 0 0
  • 幸福是什么?幸福就是:猫吃鱼,狗吃肉,奥特曼打小怪兽。 读完作文题目,小怪兽提笔写下了这句话,作为文章的开头。坐在...
    Frances菇凉阅读 1,951评论 0 2