1
fighterlyt 2019-04-27 10:11:03 +08:00
不保证顺序,不代表有序,尤其是在不同版本之间,或者说不同数据之间。毕竟不可能为了无序,特意创建一些干扰
|
2
fighterlyt 2019-04-27 10:14:07 +08:00 1
The iteration order over maps is not specified and is not guaranteed to be the same from one iteration to the next. 这是官方文档,说的很清楚,不保证,不描述,不确定
|
3
choice4 OP @fighterlyt key 顺序是 10,4,2,1,8 我测试总是有序,资料上是无序的(既没有大小排列,也没有按照保存顺序排列)。同时在我调整 key 值,整个 map 最后还是会按照 key 从小到大排列,就有了疑问。
|
4
fighterlyt 2019-04-27 10:15:26 +08:00
@choice4 哪里资料上说无序了,程序员别看什么野鸡资料
|
5
choice4 OP @fighterlyt 谢谢大哥
|
6
Zakun 2019-04-27 10:19:47 +08:00 via Android
无序,因为是动态扩展的,可能变化后顺序发生变化。
|
7
fuxiaohei 2019-04-27 10:19:52 +08:00
fmt.Print 在 1.12.4 做了顺序打印。你如果 range 一个一个打印,每次不同
|
8
jadeity 2019-04-27 10:21:24 +08:00 5
|
9
reus 2019-04-27 10:26:12 +08:00
range 遍历是无序的,甚至小的 map 会刻意引入随机性,避免你依赖“遍历有序”这个偶然现象,因为语言规范没有规定 map 的遍历是有序的
1.12 的打印是有序的,注意只是打印出来有序 不要用“试验”,要看语言规范。你试验 1000 次是这样,不代表下一个版本也还是这样,不代表在其他操作系统上也是这样。 |
10
heimeil 2019-04-27 10:31:26 +08:00 via Android
A map is an unordered group of elements of one type
MapType = "map" "[" KeyType "]" ElementType . 是指元素并不是像数组那样有序的存在一起,而是随机存储的 |
11
kiwier 2019-04-27 10:37:31 +08:00
想有序用切片
|
13
skadi 2019-04-27 12:04:40 +08:00
无序
|
14
loading 2019-04-27 12:21:11 +08:00
不保证有序,你看着想有序只是错觉。
|
15
zhs227 2019-04-27 13:51:06 +08:00
从 1.12 开始,golang 工程师们为了方便码工们 debug,特意在直接打印输出时做了排序,但并不代表它是有序的
|
16
zhs227 2019-04-27 13:53:47 +08:00
参考: https://golang.org/doc/go1.12
1.12 的 release 包中关于 fmt 的修改: fmt Maps are now printed in key-sorted order to ease testing. The ordering rules are: When applicable, nil compares low ints, floats, and strings order by < NaN compares less than non-NaN floats bool compares false before true Complex compares real, then imaginary Pointers compare by machine address Channel values compare by machine address Structs compare each field in turn Arrays compare each element in turn Interface values compare first by reflect.Type describing the concrete type and then by concrete value as described in the previous rules. When printing maps, non-reflexive key values like NaN were previously displayed as <nil>. As of this release, the correct values are printed. |
17
EDDYCJY 2019-04-27 13:57:24 +08:00 via iPhone
可以看下这篇文章 [为什么遍历 Go map 是无序的?],传送门: https://segmentfault.com/a/1190000018782278
|