当前位置: 首页 > news >正文

Go 语言 map 如何顺序读取?

Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。

然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。

现象

先看一段代码示例:

package mainimport "fmt"func main() {m := map[string]int{"apple":  1,"banana": 2,"orange": 3,}for k, v := range m {fmt.Printf("key=%s, value=%d\n", k, v)}
}

当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。

原因

首先,Go 语言 map 的底层实现是哈希表,在进行插入时,会对 key 进行 hash 运算。这也就导致了数据不是按顺序存储的,和遍历的顺序也就会不一致。
第二,map 在扩容后,会发生 key 的搬迁,原来落在同一个 bucket 中的 key,搬迁后,有些 key 可能就到其他 bucket 了。
而遍历的过程,就是按顺序遍历 bucket,同时按顺序遍历 bucket 中的 key。
搬迁后,key 的位置发生了重大的变化,有些 key 被搬走了,有些 key 则原地不动。这样,遍历 map 的结果就不可能按原来的顺序了。
最后,也是最有意思的一点。
那如果说我已经初始化好了一个 map,并且不对这个 map 做任何操作,也就是不会发生扩容,那遍历顺序是固定的吗?
答:也不是。
Go 杜绝了这种做法,主要是担心程序员会在开发过程中依赖稳定的遍历顺序,因为这是不对的。
所以在遍历 map 时,并不是固定地从 0 号 bucket 开始遍历,每次都是从一个随机值序号的 bucket 开始遍历,并且是从这个 bucket 的一个随机序号的 cell 开始遍历。

如何顺序读取

如果希望按照特定顺序遍历 map,可以先将键或值存储到切片中,然后对切片进行排序,最后再遍历切片。

改造一下上面的代码,让它按顺序输出:

package mainimport ("fmt""sort"
)func main() {m := map[string]int{"apple":  1,"banana": 2,"orange": 3,}// 将 map 中的键存储到切片中keys := make([]string, 0, len(m))for k := range m {keys = append(keys, k)}// 对切片进行排序sort.Strings(keys)// 按照排序后的顺序遍历 mapfor _, k := range keys {fmt.Printf("key=%s, value=%d\n", k, m[k])}
}
http://www.lryc.cn/news/185237.html

相关文章:

  • flutter StreamSubscription 订阅者 stream
  • 安全性算法
  • 解决ASP.NET Core的中间件无法读取Response.Body的问题
  • DownloadingImages 下载缓存图片,显示图片文字列表
  • 【应用层协议】HTTPS的加密流程
  • 最新AI创作系统/AI绘画系统/ChatGPT系统+H5源码+微信公众号版+支持Prompt应用
  • Z410 2023款无人机,专为零基础开发者打造的入门级开源无人机
  • elementui修改message消息提示颜色
  • Linux和Hadoop的学习
  • 通达信指标预警信号,自动发送给微信好友1.0
  • 浅谈CDN内容分发与全局负载均衡
  • 【框架风格】解释器模式
  • c++视觉图像线性混合
  • Doris 2.0.1 DockerFile版 升级实战
  • kotlin aes 加密解密
  • sqlite3的lib和头文件在哪下载 2023/9/19 上午10:46:43
  • 磁通量概述
  • MySql 终端常用指令
  • 【React-hooks篇幅】自定义hooks
  • 面试算法21:删除倒数第k个节点
  • 数据结构——排序算法(C语言)
  • 基于Http Basic Authentication的接口
  • 【yaml文件的编写】
  • kt6368A双模蓝牙芯片无法透传 可能是什么问题呢
  • SpringBoot终极讲义第二章笔记
  • 【C++面向对象侯捷下】4. pointer-like classes,关于智能指针 | 5. function-like classes,所谓仿函数
  • 社科院与杜兰大学能源管理硕士项目——惊喜会随时间慢慢酝酿而出
  • Array简介
  • Django的模版使用(Django-03)
  • 详解分布式搜索技术之elasticsearch