for-range 造就循环永动机?快来看看 go 中 for-range 的那些事!
来自公众号:新世界杂货铺
循环永动机
Q1: 如果我们在遍历数组的同时修改数组元素,能否得到一个永远都不会停止的循环呢?
上述代码的输出意味着循环只遍历了原始切片中的三个元素,我们遍历切片时追加的元素不会增加循环的执行次数, 所以循环最终还是停了下
答: 对于所有的range循环, Go语言会在编译期间将原切片
或者数组
赋值给一个新的变量ha
, 在赋值的过程中就发生了拷贝, 所以我们遍历的切片已经不是原始的切片变量了
神奇的指针
Q2: 我们遍历一个数组时,如果获取range
返回变量的地址并保存到另一个数组或哈希时, 就会遇到令人困惑的现象
答: 遇到这种同时遍历索引和元素的range循环时, go语言会额外创建一个新的v2
变量存储切片中的元素, 循环中使用的这个变量v2会在每一次迭代被重新赋值而覆盖, 在赋值时也发生了拷贝
. 因为在循环中返回的变量的地址都完全相同, 所以才会出现神奇的指针的现象
map的随机遍历
Q3: go语言中使用range遍历哈希表时, 往往都会得到不同的结果?
答: 但这并不是说明哈希表不稳定, 这是go语言故意这样设计的, 他在运行时为哈希表遍历引入不确定性, 也是告诉所有使用go语言的使用者, 程序不要依赖于哈希表的稳定遍历。
参考
https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-for-range/
版权声明: 本文为 InfoQ 作者【新世界杂货铺】的原创文章。
原文链接:【http://xie.infoq.cn/article/32996d7976619dba43f037cda】。未经作者许可,禁止转载。
评论