码迷,mamicode.com
首页 > 其他好文 > 详细

Go——array、slice和map的区别

时间:2018-12-05 16:19:44      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:http   tps   ble   一个   比较   dex   依赖   复杂度   大小   

参考文章: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——array、slice和map的区别

标签:http   tps   ble   一个   比较   dex   依赖   复杂度   大小   

原文地址:https://www.cnblogs.com/alanabc/p/10070760.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!