Go map 加有序排序的一些挣扎

Go map 加有序排序的一些挣扎

Go语言圈
Go语言开发者的学习好助手,分享Go语言知识,技术技巧,学习与交流Go语言开发经验,互动才有助于技术的提升,每天5分钟,助你GO语言技术快乐成长
155篇原创内容
学习与交流: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 有序,有以下两种常见的方案:

  1. 使用有序的数据结构代替 map:可以使用 slice 或 linked list 等有序数据结构来存储键值对,并根据需要进行排序。

  2. 使用 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循环遍历 也有内涵
阅读 893
 
2条留言
写留言
  •  
    第二种为什么不直接遍历原map取key
     
     
  •  
    用map就是想用它存取快的特性,需要排序的就不用map就好了
     
     
已无更多数据
 
 
 
 
 
 
 
posted @   技术颜良  阅读(362)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!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解决方案的总结
点击右上角即可分享
微信分享提示