go语言map遍历时添加新key/value,此情况是如何工作的?

做了如下测试

代码:

func main() {
    map1 := map[string]int{
        "a": 1,
        "b": 2,
        "c": 3,
        "d": 4,
    }
    for k, v := range map1 {
        fmt.Println(k, ":", v)
        map1[string(k[0]+1)] = v + 1
    }
}

输出:

API server listening at: 127.0.0.1:20657
c : 3
d : 4
e : 5
f : 6
g : 7
h : 8
a : 1
b : 2

多次执行的结果都是不一样的,但是都是有限次数(最高8次)
为何不会一直循环下去 还有这样是如何工作的

阅读 13.3k
3 个回答

golang的map是hash表实现的,hash表的遍历就是遍历所有的桶,所以新添加的元素可能出现在之前遍历过的桶中,这样就会有些新添加的元素可能遍历不到。
实际生成环境中,不建议遍历一个正在写入的map,这并不是一种好的设计,如果确实有这样的需求,要特别注意rehash操作内存重新分配,原来遍历的指针可能失效导致core掉。

新手上路,请多包涵
  1. range map的时候,访问序列是随机的,所以会看到多次遍历打印序列不同
  2. 无锁情况下,如果在遍历的时候同时删除一个key,并且key没有被访问过,不会有问题
  3. 无锁,遍历map同时增加一个key,那么这个key有可能被本次遍历访问到,也可能不会被访问到
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏