在Go中迭代时修改地图
鉴于以下代码,我预计会出现无限循环,但循环在某个点停止。
m := make(map[int]string, 4)
m[0] = "Foo"
for k, v := range m {
m[k+1] = v
}
我无法弄清楚幕后发生了什么,因为不同的执行会返回不同的输出。例如,这些是来自不同执行的一些输出:
map[0:Foo 1:Foo 2:Foo 3:Foo 4:Foo 5:Foo 6:Foo 7:Foo]
map[0:Foo 1:Foo]
map[0:Foo 1:Foo 2:Foo]
如何range在某个点退出循环,退出条件是什么?
回答
规范:对于带有范围子句的语句表示行为是不可预测的:
地图上的迭代顺序未指定,并且不能保证从一次迭代到下一次迭代是相同的。如果在迭代过程中删除了尚未到达的映射条目,则不会产生相应的迭代值。如果在迭代期间创建了映射条目,则该条目可能在迭代期间产生或可能被跳过。对于创建的每个条目以及从一个迭代到下一个迭代,选择可能会有所不同。如果映射为
nil,则迭代次数为 0。
将元素添加到您正在浏览的地图中,这些条目可能会或可能不会被循环访问,您不应该对此做出任何假设。