3 回答
TA贡献1801条经验 获得超8个赞
Spec:对于具有范围子句的语句,表示行为是不可预测的:
未指定映射的迭代顺序,也不保证从一次迭代到下一次迭代相同。如果在迭代期间移除尚未到达的映射条目,则不会生成相应的迭代值。如果在迭代期间创建了映射条目,则该条目可能会在迭代期间生成,也可以跳过。对于创建的每个条目以及从一次迭代到下一次迭代,选择可能会有所不同。如果映射为 ,则迭代次数为 0。
nil
将元素添加到您正在测距的地图中,这些条目可能会被循环访问,也可能不会被循环访问,您不应该假设与此相关的任何事情。
TA贡献1828条经验 获得超4个赞
其他答案已经解释了您在代码段中观察到的行为。
由于您的标题相当通用,但您的代码段仅涵盖在迭代地图时添加地图条目,因此这里有一个补充示例,应该说服您,在迭代地图时“交叉删除”地图条目是一个坏主意(Playground):
package main
import "fmt"
func main() {
m := map[string]int{"foo": 0, "bar": 1, "baz": 2}
for k := range m {
if k == "foo" {
delete(m, "bar")
}
if k == "bar" {
delete(m, "foo")
}
}
fmt.Println(m)
}
该规范说:
未指定映射的迭代顺序,也不保证从一次迭代到下一次迭代相同。如果在迭代期间移除尚未到达的映射条目,则不会生成相应的迭代值。
结果,程序输出 或 ,但无法分辨哪个。map[bar:1 baz:2]map[baz:2 foo:0]
- 3 回答
- 0 关注
- 87 浏览
添加回答
举报