美文网首页
Golang range 的一些坑

Golang range 的一些坑

作者: youmisun | 来源:发表于2018-10-18 17:05 被阅读0次

    先举个栗子:

    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 只会声明初始化一次,不会每次循环都声明初始化。

    相关文章

      网友评论

          本文标题:Golang range 的一些坑

          本文链接:https://www.haomeiwen.com/subject/xtmjzftx.html