欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

go range踩过的那些坑

程序员文章站 2024-01-21 19:10:16
...

首先我们看下面这段代码,及其输出结果:

number := [...]int{1, 2, 3, 4, 5, 6}
    for i, e := range number {
        if i == len(number)-1 {
            number[0] += e
        } else {
            number[i+1] += e
        }
    }
    fmt.Println(number)

output:  [7 3 5 7 9 11]

如果结果和你预测的一样,恭喜你跨过了这个坑。
如果不一样,往下看:

number := []int{1, 2, 3, 4, 5, 6}
    for i, e := range number {
        if i == len(number)-1 {
            number[0] += e
        } else {
            number[i+1] += e
        }
    }
    fmt.Println(number)

output:  [49 10 15 22 31 42]

再看完这段代码,有没有想起来点什么。如果还是不明白,接着往下看
解释: range后面跟的表达式称作range表达式,它只会在range语句第一次循环的时候执行一次,表达式的结果会被复制一份来做接下来的迭代操作。第一个例子数组是值类型,所以迭代的数组和number是两个不同的数组;slice是指针类型数据,所以复制的是指针,两个指针指向的是同一个内存地址,所以操作的是同一份数据