Go学习笔记之map的声明和初始化

2022-11-30 128阅读 0评论

Map

?=

map 是一种无序的键值对的集合

map最重要的一点是通过key来快速检索数据,key似于索引,指向数据的值。

map是一种集合,因此我们可以像迭代数组切片那样迭代它。不过,map是无序的,我们无法决定它的返回顺序,这是因为map是用哈希表来实现的。

map是引用类型,可以使用如下方式声明:

//[keytype] 和 valueType 之间允许有空格。 var mapname map[keytype]valuetype 

其中:

mapname为map的变量名。keytype为键类型。valuetype是键对应的值类型。

注意

在声明的时候不需要知道map的长度,因为map是可以动态增长的,初始化的map的值是nil,使用函数len()可以获取map中键值对的数目。

下面请看两个例子:

例子1:

package main  import ( 	"fmt" )  func main() { 	//初始化一个没有键值对的map 	map1 := map[int]int{} 	//falsae 	fmt.Println(map1 == nil) 	//未进行初始化 	var map2 map[int]int 	//true 	fmt.Println(map2 == nil)  } 

例子2:

package main import "fmt" func main() { var mapLit map[string]int var mapAssigned map[string]int //初始化一个含有两个键值对的map mapLit = map[string]int{"one": 1, "two": 2} mapAssigned = mapLit  mapAssigned["two"] = 3 fmt.Printf("Map literal at \"one\" is: %d\n", mapLit["one"]) fmt.Printf("Map assigned at \"two\" is: %d\n", mapLit["two"]) fmt.Printf("Map literal at \"ten\" is: %d\n", mapLit["ten"]) } 

输出结果是什么呢?

输出的结果是

Map literal at "one" is: 1Map assigned at "two" is: 3Map literal at "ten" is: 0

因为mapAssigned 是 maplist 的引用,对 mapAssigned 的修改也会影响到 mapList 的值。因此在修改mapAssigned[“two”]为3时,mapList["two]也是3。

map还有另外一种创建方式

make(map[keytype]valuetype,cap)

例如:

map2 := make(map[string]int, 100)

当 map 增长到容量上限的时候,如果再增加新的 key-value,map 的大小会自动加 1,所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。

既然一个 key 只能对应一个 value,而 value 又是一个原始类型,那么如果一个 key 要对应多个值怎么办?

答案是:使用切片

例如,当我们要处理 unix 机器上的所有进程,以父进程(PID 为整形)作为 key,所有的子进程(以所有子进程的 pID 组成的切片)作为 value。

通过将 value 定义为 []int 类型或者其他类型的切片,就可以优雅的解决这个问题,示例代码如下所示:

mp1 := make(map[int][]int) mp2 := make(map[int]*[]int) 

补充:为什么map输出是无序的?

遍历map的时候,取随机数,把桶的遍历顺序随机化。原因是golang底层并没有保证这一点,或许(现在/以后)会有特殊情况出现顺序不固定的情况。担心开发者们误解这一点,Golang就特意去打乱了这个顺序,让开发者们知道GoLang底层不保证map每次遍历都是同一个顺序。

Go的Map本质上是“无序的”

“无序”写入

正常写入(非哈希冲突写入):是hash到某一个bucket上,而不是按buckeTS顺序写入。哈希冲突写入:如果存在hash冲突,会写到同一个bucket上,更有可能写到溢出桶去

扩容导致无序

成倍扩容迫使元素顺序变化,等量扩容并没有改变元素顺序

总结无序原因

无序写入成倍扩容迫使元素顺序变化

总结

到此这篇关于GO学习笔记之map的声明和初始化的文章就介绍到这了,更多相关go map的声明和初始化内容请搜索云初冀北以前的文章或继续浏览下面的相关文章希望大家以后多多支持云初冀北!

免责声明
本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail:goliszhou@gmail.com
$

发表评论

表情:
评论列表 (暂无评论,128人围观)

还没有评论,来说两句吧...