Go map 加有序排序的一些挣扎
Go map 加有序排序的一些挣扎
Go语言圈
Go语言开发者的学习好助手,分享Go语言知识,技术技巧,学习与交流Go语言开发经验,互动才有助于技术的提升,每天5分钟,助你GO语言技术快乐成长
公众号
商务合作加微信:LetsFeng
现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.
Goland 全家桶激活码,永久有效,亲测可用,限时免费
获取链接地址:https://web.52shizhan.cn
我们都知道,在Go语言 中的 map 是无序的,这意味着无法保证遍历 map 时的顺序与元素添加的顺序一致。
下面是一个简单的例子来展示 map 的无序性:
package main
import "fmt"
func main() {
// 创建一个 map
myMap := make(map[string]int)
// 向 map 中添加键值对
myMap["apple"] = 10
myMap["banana"] = 5
myMap["orange"] = 7
// 遍历 map,并打印键值对
for key, value := range myMap {
fmt.Println(key, ":", value)
}
}
每次运行此程序时,输出的键值对的顺序可能会不同,因为 map 是无序的。例如,一次运行的输出可能是:
banana : 5
apple : 10
orange : 7
而另一次运行的输出可能是:
orange : 7
apple : 10
banana : 5
如果要让 map 有序,有以下两种常见的方案:
-
使用有序的数据结构代替 map:可以使用
slice
或linked list
等有序数据结构来存储键值对,并根据需要进行排序。 -
使用
sync.Map
(Go 1.9 版本后引入):sync.Map
是 Go 标准库中的一个并发安全的 map 类型,虽然它本身是无序的,但可以通过额外的步骤使其变得有序。
下面分别介绍这两种方案:
方案一:使用有序的数据结构
package main
import (
"fmt"
"sort"
)
func main() {
myMap := map[string]int{
"apple": 10,
"banana": 5,
"orange": 7,
}
// 将 map 转换为 slice
var keys []string
for key := range myMap {
keys = append(keys, key)
}
// 对键进行排序
sort.Strings(keys)
// 遍历有序的键,并打印对应的值
for _, key := range keys {
fmt.Println(key, ":", myMap[key])
}
}
方案二:使用 sync.Map
package main
import (
"fmt"
"sort"
"sync"
)
func main() {
myMap := &sync.Map{}
myMap.Store("apple", 10)
myMap.Store("banana", 5)
myMap.Store("orange", 7)
// 将 map 转换为 slice
var keys []string
myMap.Range(func(key, value interface{}) bool {
keys = append(keys, key.(string))
return true
})
// 对键进行排序
sort.Strings(keys)
// 遍历有序的键,并打印对应的值
for _, key := range keys {
value, _ := myMap.Load(key)
fmt.Println(key, ":", value)
}
}
上述两种方案都可以使 map 的键值对有序化。具体选择哪种方案取决于应用的具体需求和性能要求。
文章首发:
更多相关Go语言的技术文章或视频教程,请关注本公众号获取并查看,感谢你的支持与信任!
学Go语言哪些事儿 · 目录
上一篇用Go语言做一个 https 证书时间检测工具,如何做?下一篇Go 语言的 if条件判断和for循环遍历 也有内涵
Go语言圈
分类:
GO
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2023-04-03 btrfs 创建快照
2022-04-03 k8s event事件的重要性(重要)
2021-04-03 ansible {{}}引用变量,变量中嵌套变量如何表示
2019-04-03 MySQL利用binlog恢复误操作数据(python脚本)
2018-04-03 针对负载均衡集群中的session解决方案的总结