Golang Go语言中 map 有序

Golang Go语言中 map 有序
1.12.4,windows.


Map 是不是有序了呢,我看的资料是 1.9.x 强调表示 map 被设计为无序,但我使用 map[int]string 时 ,map 总是有序的。

18 回复

不保证顺序,不代表有序,尤其是在不同版本之间,或者说不同数据之间。毕竟不可能为了无序,特意创建一些干扰

更多关于Golang Go语言中 map 有序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


The iteration order over maps is not specified and is not guaranteed to be the same from one iteration to the next. 这是官方文档,说的很清楚,不保证,不描述,不确定

key 顺序是 10,4,2,1,8 我测试总是有序,资料上是无序的(既没有大小排列,也没有按照保存顺序排列)。同时在我调整 key 值,整个 map 最后还是会按照 key 从小到大排列,就有了疑问。

哪里资料上说无序了,程序员别看什么野鸡资料

谢谢大哥

无序,因为是动态扩展的,可能变化后顺序发生变化。

fmt.Print 在 1.12.4 做了顺序打印。你如果 range 一个一个打印,每次不同

range 遍历是无序的,甚至小的 map 会刻意引入随机性,避免你依赖“遍历有序”这个偶然现象,因为语言规范没有规定 map 的遍历是有序的

1.12 的打印是有序的,注意只是打印出来有序

不要用“试验”,要看语言规范。你试验 1000 次是这样,不代表下一个版本也还是这样,不代表在其他操作系统上也是这样。

A map is an unordered group of elements of one type

MapType = “map” “[” KeyType “]” ElementType .

是指元素并不是像数组那样有序的存在一起,而是随机存储的

想有序用切片




是的, 是因为 fmt.print 顺序打印, range 遍历确实无序。thx

不保证有序,你看着想有序只是错觉。

从 1.12 开始,golang 工程师们为了方便码工们 debug,特意在直接打印输出时做了排序,但并不代表它是有序的

参考: 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.

可以看下这篇文章 [为什么遍历 Go map 是无序的?],传送门: https://segmentfault.com/a/1190000018782278

在Go语言中,map 本质上是一个无序的数据结构。虽然在实际应用中,某些实现(如基于哈希表的默认实现)可能会让 map 在特定情况下表现出一定的顺序(例如,按键的插入顺序或哈希值的顺序),但这种顺序不应被视为可依赖的行为。

Go语言的规范明确指出,map 的迭代顺序是不确定的,并且可能在程序运行的不同时间或不同运行之间发生变化。这意味着,如果你需要在 map 中保持特定的顺序(例如按键的插入顺序、字母顺序等),你应该使用其他数据结构来实现。

一种常见的替代方案是使用切片(slice)来存储键值对,并手动维护所需的顺序。例如,你可以定义一个结构体来存储键和值,然后将这些结构体按照所需的顺序存储在切片中。这样,你就可以通过迭代切片来以确定的顺序访问元素。

此外,如果你需要一种既能够保持顺序又能够快速查找的数据结构,可以考虑使用平衡二叉树(如红黑树)或有序映射(sorted map)等高级数据结构。不过,这些数据结构在Go标准库中并没有直接提供,你可能需要使用第三方库或自己实现。

总之,虽然Go语言的 map 在某些情况下可能会表现出一定的顺序,但你不应该依赖这种顺序。如果你需要确定的顺序,应该使用其他数据结构来实现。

回到顶部