Go——arrayslice和map的区别

Posted alanabc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go——arrayslice和map的区别相关的知识,希望对你有一定的参考价值。

参考文章:https://go101.org/article/container.html

1. 文字表示

技术分享图片

N:一般称作长度,表示元素的个数。
T:表示元素的类型,可以是任意类型。
K:在map中表示索引的类型,可以是任意可比较的类型。

2. 例子

技术分享图片

3. 正篇

如【1】所示,宏观上来看,array、slice、map的区别在于:

  • a. array的定义是有长度的
  • b. slice的定义没有长度
  • c. map的定义没有长度

三种数据类型中的每一个元素都有一个对应的key值,这些key值叫做索引(index)。其中,array和slice的索引都是连续的int类型,并且从0开始递增计数(这与我们熟知的数组一样)。而map的索引则不太一样,可以是任意可比较类型的任意值。比如,定义map如下:

map[string][]

那么这个map的索引类型就是string,我可以把它的值设为任意一个字符串;如果是bool类型,那么索引可以是true或者false(这里说的是索引的值,不是元素的值)。


三种数据类型的区别主要体现在存储结构的差异。array在内存占有一块连续的存储空间,存储长度n的值和n个元素的值;slice在内存上首先占有一个存储了长度、空间大小和指针的存储空间,如果有元素的话,这些元素又占有另一个连续的存储空间,先前的指针指向这里的第一个元素;所以说slice的本质其实是一个特殊的指针。map依赖于Go的hashtable算法,元素也占有一个连续的存储空间,但是元素并不连续(存储空间的地址是连续的,但是某些地址可能没有存储数值,因此也就把有数值的地址隔开了,所以说元素不连续);map的本质也是指针。

这三种数据类型都是用索引来查找元素,时间复杂度都是O(1),但由于存储结构的差异,所以map查找元素时花费的时间还是要大于array和slice的。


在赋值的时候(传递值给新的变量),同样由于存储结构上的差异,array是直接把整个数据copy一份,新变量内的元素改变并不会影响旧变量;slice则是把指针copy一份,所以新变量内的元素改变,旧变量也改变;map与slice同理。



以上是关于Go——arrayslice和map的区别的主要内容,如果未能解决你的问题,请参考以下文章

peptide map DDA和IMS有啥区别

Go 中 fmt.Println() 和 println() 的区别

Go语言中new与make的区别

Go 语言范围(Range)

Go 语言范围(Range)

swift ArraySlice