iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >详解Golang Map中的key为什么是无序的
  • 173
分享到

详解Golang Map中的key为什么是无序的

2024-04-02 19:04:59 173人浏览 八月长安
摘要

目录一、为什么是无序的?二、Go 为什么要这么做?三、遍历是否真的无序的1.第一次遍历2.第二次遍历四、如何才能得到有序的键值对总结一、为什么是无序的? 开门见山,先上源码 func

一、为什么是无序的?

开门见山,先上源码

func mapiterinit(t *maptype, h *hmap, it *hiter) {
 
	// decide where to start
	r := uintptr(fastrand())
	if h.B > 31-bucketCntBits {
		r += uintptr(fastrand()) << 31
	}
	
	mapiternext(it)
}

Go 当我们在遍历 map 时,并不是固定地从第一个数开始遍历,每次都是从一个位置开始遍历。即使是一个不会改变的的 map,仅仅只是遍历它,也不太可能会返回一个固定顺序了。
也就是说,GO语言从语言上进行 Map 的无序。

二、GO 为什么要这么做?

其实主要是因为 map 在扩容后,可能会将部分 key 移至新内存,那么这一部分实际上就已经是无序的了。而遍历的过程,其实就是按顺序遍历内存地址,同时按顺序遍历内存地址中的 key。但这时已经是无序的了。

当然有人会说,如果我就一个 map,我保证不会对 map 进行修改删除等操作,那么按理说没有扩容就不会发生改变。但也是因为这样,GO 才在源码中
加上随机的元素,将遍历 map 的顺序随机化,用来防止使用者用来顺序遍历。而这是有风险的代码,在GO 的严格语法规则下,是坚决不提倡的。

三、遍历是否真的无序的

1.第一次遍历

代码如下(示例):

package main

import "fmt"

func main() {

	noSortMap := map[int]int{
		1: 1,
		2: 2,
		3: 3,
		4: 4,
		5: 5,
		6: 6,
	}

	for k, v := range noSortMap {

		fmt.Println("key: ", k, "value: ", v)
	}

}

结果果然不出所料,并没有从第一个数开始

第一次遍历

2.第二次遍历

代码同上:

结果果然不出所料,与第一次都不相同

在这里插入图片描述

四、如何才能得到有序的键值对

我们需要使用 切片(Slice) 来进行控制,

1.详细代码

代码如下(示例):

package main

import (
	"fmt"
	"sort"
)

func main() {

	noSortMap := map[int]int{
		1: 1,
		2: 2,
		3: 3,
		4: 4,
		5: 5,
		6: 6,
	}

	var noSortSlice []int
	for k, v := range noSortMap {

		noSortSlice = append(noSortSlice, k)
		fmt.Println("key: ", k, "value: ", v)
	}

	fmt.Println(noSortSlice)
	// 排序
	sort.Ints(noSortSlice)
	sortSlice := noSortSlice
	fmt.Println(sortSlice)
	for _, k := range sortSlice {

		fmt.Println("key: ", k, "value: ", noSortMap[k])
	}
	
}

先将无序的key 放进切片中

无序

再将无序的切片 调用 sort包的 Ints 方法排序

排序后再遍历切片,此时切片有序,则 map 的键值对也是有序的

有序

总结

不要依赖map遍历时返回的key顺序,采用随机选择遍历起始位置的方式使得遍历时返回是乱序的。如果想得到有序键值,请依靠有序切片进行访问来得到有效的有序 Map

到此这篇关于详解golang Map中的key为什么是无序的的文章就介绍到这了,更多相关Golang Map key无序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 详解Golang Map中的key为什么是无序的

本文链接: https://www.lsjlt.com/news/139464.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Golang Map中的key为什么是无序的
    目录一、为什么是无序的?二、GO 为什么要这么做?三、遍历是否真的无序的1.第一次遍历2.第二次遍历四、如何才能得到有序的键值对总结一、为什么是无序的? 开门见山,先上源码 func...
    99+
    2024-04-02
  • golang判断key是否在map中的代码
    个人常用函数 func IsContain(items []string, item string) bool { for _, eachItem := range items...
    99+
    2024-04-02
  • golang怎么正确删除map中的key
    本篇内容主要讲解“golang怎么正确删除map中的key”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“golang怎么正确删除map中的key”吧!在 Golang 中,map 是一个非常重要...
    99+
    2023-07-05
  • golang中map的概念是什么
    本文小编为大家详细介绍“golang中map的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang中map的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在golang中,map是一种...
    99+
    2023-07-04
  • Golang中map的实现原理是什么
    这篇“Golang中map的实现原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang中map的实现原理是什么...
    99+
    2023-07-05
  • mysql中的key是什么
    mysql 中的 key 是索引结构,用于快速查找和访问数据。它存储列值和行指针,并根据列值快速定位数据行,提高查询性能。mysql 支持多种 key 类型,包括主键、唯一键、普通索引、...
    99+
    2024-04-26
    mysql
  • Vue中为什么不推荐用index做key详解
    目录前言diff算法key的作用通过 key 管理状态效率 & Bug总结前言 尤大在vue 2.x的文档中明确指出:建议尽可能在使用 v-for 时提供...
    99+
    2024-04-02
  • Golang中Map的灵活修改策略详解
    Golang中Map的灵活修改策略详解 在Go语言中,Map是一种常用的数据结构,用于存储键值对。Map在实际开发中经常被用来存储数据集合,并提供快速的查找、插入和删除操作。因此,了解...
    99+
    2024-03-02
    golang map 修改 go语言 键值对
  • 分析Golang中map的删除操作详解
    在Golang中,map(映射)是一种非常常用的数据结构,用于存储键值对。在使用map的过程中,涉及到对map进行删除操作是非常重要的,因为错误的删除操作可能会导致内存泄漏或者程序运行...
    99+
    2024-02-24
    删除 golang map 键值对
  • Golang中的切片是什么?详细解析
    标题:深入探究Golang中的切片类型 Golang是一门由谷歌开发的编程语言,自面世以来备受开发者们的追捧。在Golang中,切片(Slice)是一个非常重要且常用的数据结构,它在很...
    99+
    2024-03-02
    golang 切片 解析 golang开发
  • golang map删除元素的方法是什么
    在Go语言中,可以使用`delete()`函数来删除map中的元素。`delete()`函数的语法如下:```godelete(ma...
    99+
    2023-10-12
    golang
  • python中key的用法是什么
    在Python中,key是用于指定排序的规则的参数。在一些排序函数或方法中,可以通过指定key参数来自定义排序的规则。例如,在使用s...
    99+
    2024-03-01
    python
  • react中key的作用是什么
    本文小编为大家详细介绍“react中key的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“react中key的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • vue中key的作用是什么
    这篇文章将为大家详细讲解有关vue中key的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么要使用VueVue是一款友好的、多用途且高性能的JavaScript框架,使用vue...
    99+
    2023-06-14
  • react中map的用法是什么
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react中map的用法是什么?React 中 map() 方法的使用,以及 key 值的绑定。1、这里以一个循环显示一个数组ToDoList的例子来展示...
    99+
    2023-05-14
    map React
  • Golang中泛型是什么?详细解析
    泛型是允许函数和类型的定义可以为多种类型工作,从而提高可重用性和可维护性的特性。go 中的泛型使用方括号表示类型参数,可以接受各种可比较类型。它的用例包括消除重复代码、提高可读性、改善类...
    99+
    2024-04-03
    golang 泛型
  • python中sort key的用法是什么
    在Python中,sort key参数是用来指定在排序过程中使用的自定义函数。通过指定sort key参数,我们可以对可迭代对象中的...
    99+
    2024-03-15
    python
  • Vuejs中key值的作用是什么
    这篇文章给大家介绍Vuejs中key值的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。key 的一个错误使用——使用 index 作为 key不知道你在写 v-for 的时候,会不会直接使用 index 作为...
    99+
    2023-06-15
  • Golang channel为什么不会阻塞的原因详解
    正文 最近在学通道channel,发现一个简单的demo: package main import "fmt" func main() { chanInt := make(c...
    99+
    2024-04-02
  • 解读Python中字典的key都可以是什么
    目录Python字典的key都可以是什么答解释注意Python字典的key都可以是什么 答 一个对象能不能作为字典的key,就取决于其有没有__hash__方法。所以所有python...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作