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次)
为何不会一直循环下去 还有这样是如何工作的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
朋友给发了个文章链接
Go Range 内部实现http://www.jianshu.com/p/35c2...
golang的map是hash表实现的,hash表的遍历就是遍历所有的桶,所以新添加的元素可能出现在之前遍历过的桶中,这样就会有些新添加的元素可能遍历不到。
实际生成环境中,不建议遍历一个正在写入的map,这并不是一种好的设计,如果确实有这样的需求,要特别注意rehash操作内存重新分配,原来遍历的指针可能失效导致core掉。