我写了一些能做到这一点的代码,并且运行良好,但是在查看代码时,我意识到我所做的工作可能无法在其他语言中工作。
举一个人为的例子:
dict := map[string]string{ "a": "1", "b": "2" }
for key, val := range dict {
fmt.Println(val)
delete(dict, "b")
}
这会打印“ 1”和“ 2”,之后我检查dict
时,它仅为{ "a": "1" }
。
因此,我觉得这样做很安全,但我想知道为什么吗?
range dict
是否在内部创建副本?
答案 0 :(得分:3)
和往常一样,the spec是确定的答案。向下滚动到“对于带范围子句的语句”,第3项(重点是我的):
未指定地图上的迭代顺序,并且不能保证每次迭代之间都相同。 如果在迭代过程中删除尚未到达的地图条目,则不会生成相应的迭代值。如果在迭代过程中创建了地图条目,则该条目可能在迭代过程中产生或可以被跳过。对于创建的每个条目以及从一个迭代到下一个迭代,选择可能有所不同。如果映射为nil,则迭代次数为0。