在迭代字典键时删除字典键是否安全?

时间:2019-05-08 20:03:47

标签: go

我写了一些能做到这一点的代码,并且运行良好,但是在查看代码时,我意识到我所做的工作可能无法在其他语言中工作。

举一个人为的例子:

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是否在内部创建副本?

1 个答案:

答案 0 :(得分:3)

和往常一样,the spec是确定的答案。向下滚动到“对于带范围子句的语句”,第3项(重点是我的):

  

未指定地图上的迭代顺序,并且不能保证每次迭代之间都相同。 如果在迭代过程中删除尚未到达的地图条目,则不会生成相应的迭代值。如果在迭代过程中创建了地图条目,则该条目可能在迭代过程中产生或可以被跳过。对于创建的每个条目以及从一个迭代到下一个迭代,选择可能有所不同。如果映射为nil,则迭代次数为0。