package main
import (
"fmt"
)
func main() {
m := make(map[int]int, 4)
m[1] = 0
m[2] = 0
for k, _ := range m {
i := 10 + k
m[i] = 0
}
fmt.Println(m)
fmt.Println("len:", len(m))
}
此代码返回:8或10或6作为循环后的映射长度。视频是here,playgroud here。
我看到新添加的元素进入范围,但无法解释为什么这个循环随机停止?
未指定地图上的迭代顺序,并且不保证从一次迭代到下一次迭代是相同的。如果在迭代期间删除了尚未到达的映射条目,则不会生成相应的迭代值。如果在迭代期间创建了映射条目,则可以在迭代期间生成该条目,或者可以跳过该条目。对于创建的每个条目以及从一次迭代到下一次迭代,选择可能不同。如果映射为nil,则迭代次数为0。
该规范指出,如果您向地图添加条目,那么您添加的元素可能会或可能不会被循环访问,而且,访问的元素甚至不具有确定性(再次执行时可能会更改)。
您正在修改正在迭代的地图。这是原因。