在迭代字典键时删除字典键是否安全? [重复]

This question already has an answer here:

I wrote some code which does this, and it is working fine, but when reviewing the code I realize what I did might not have worked in other languages.

To give a contrived example:

dict := map[string]string{ "a": "1", "b": "2" }

for key, val := range dict {
  fmt.Println(val)
   delete(dict, "b")
}

This prints "1" and "2", and when I inspect dict afterward it is { "a": "1" } only.

So, I get the impression that it is safe to do this, but I'm wondering why?

Does range dict create a copy internally?

</div>

As always, the spec is the definitive answer. Scroll down to "For statements with range clause", item 3 (emphasis mine):

The iteration order over maps is not specified and is not guaranteed to be the same from one iteration to the next. If a map entry that has not yet been reached is removed during iteration, the corresponding iteration value will not be produced. If a map entry is created during iteration, that entry may be produced during the iteration or may be skipped. The choice may vary for each entry created and from one iteration to the next. If the map is nil, the number of iterations is 0.