如何在范围循环中添加到地图中

问题描述 投票:1回答:2
package main

import (
    "fmt"
)

func main() {
    m := make(map[int]int, 4)
    m[1] = 0
    m[2] = 0
    for k, _ := range m {
        i := 10 + k
        m[i] = 0
    }
    fmt.Println(m)
    fmt.Println("len:", len(m))
}

此代码返回:8或10或6作为循环后的映射长度。视频是here,playgroud here

我看到新添加的元素进入范围,但无法解释为什么这个循环随机停止?

loops dictionary go range
2个回答
3
投票

Spec: For statements:

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

该规范指出,如果您向地图添加条目,那么您添加的元素可能会或可能不会被循环访问,而且,访问的元素甚至不具有确定性(再次执行时可能会更改)。


0
投票

您正在修改正在迭代的地图。这是原因。

© www.soinside.com 2019 - 2024. All rights reserved.