Go每日一题(3) 的题目如下

4678 次点击 · 15 赞 ·大约8小时之前 开始浏览   · 来源「Go Questions」

map 的 key 为什么是无序的?

在遍历 map 的时候,我们会发现,输出的 key 是无序的。为什么?

4678 阅读
62 回复
feiyang
feiyang · #51 · 2年之前

“迭代 map 的结果是无序的”这个特性是从 go 1.0 开始加入的。

euibieur894
euibieur894 · #52 · 2年之前

打卡

brothersam
brothersam · #53 · 2年之前

map 的key要转换成hash存到桶里面,所以无法做出有价值的排序。go1.15之后,go官方故意把遍历的顺序搞乱,同一个map实例每次遍历的顺序都故意搞成不一样。

YuPeng
YuPeng · #54 · 2年之前

mark 确实是这样

vluo_
vluo_ · #55 · 2年之前

这逻辑真的难接受,但也只能接受

528548004
528548004 · #56 · 2年之前

mark

hasbug
hasbug · #57 · 2年之前

mark

cllgeek
cllgeek · #58 · 大约1年之前

打卡

ai589636
ai589636 · #59 · 大约1年之前

Go 做得更绝,当我们在遍历 map 时,并不是固定地从 0 号 bucket 开始遍历,每次都是从一个随机值序号的 bucket 开始遍历,并且是从这个 bucket 的一个随机序号的 cell 开始遍历。这样,即使你是一个写死的 map,仅仅只是遍历它,也不太可能会返回一个固定序列的 key/value 对了 ----学习了

zhangwei_go
zhangwei_go · #60 · 5月之前

多说一句,“迭代 map 的结果是无序的”这个特性是从 go 1.0 开始加入的。

zhangwei_go
zhangwei_go · #61 · 5月之前

😀

jiazhenga
jiazhenga · #62 · 5月之前

map是根据哈希表实现的,而哈希表根据不同的哈希键来存储不同的哈希值,不同的哈希函数得到的哈希值也不同,为什么要设计成无序的呢?因为哈希表本身的存在就是为了查询的速率而不是他的顺序本身,如果为了保证顺序就会额外的操作进而影响查询的性能。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传