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

发布于 2022-09-06 07:30:53 字数 474 浏览 17 评论 0

做了如下测试

代码:

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次)
为何不会一直循环下去 还有这样是如何工作的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

2022-09-13 07:30:53

朋友给发了个文章链接
Go Range 内部实现http://www.jianshu.com/p/35c2...

稳稳的幸福 2022-09-13 07:30:53

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

怀中猫帐中妖 2022-09-13 07:30:53
  1. range map的时候,访问序列是随机的,所以会看到多次遍历打印序列不同
  2. 无锁情况下,如果在遍历的时候同时删除一个key,并且key没有被访问过,不会有问题
  3. 无锁,遍历map同时增加一个key,那么这个key有可能被本次遍历访问到,也可能不会被访问到
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文