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的区别的主要内容,如果未能解决你的问题,请参考以下文章