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是指针类型数据,所以复制的是指针,两个指针指向的是同一个内存地址,所以操作的是同一份数据
下一篇: 问下这个SQL的写法,该如何处理