Go——array、slice和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同理。

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

时间: 2024-08-29 13:38:54

Go——array、slice和map的区别的相关文章

GO語言基礎教程:array,slice,map

這節課我們來講解數組,切片和map,或許您是從其他語言轉到GO語言這邊的,那麼在其他語言的影響下您可能會不太適應GO語言的數組,因為GO語言把數組給拆分成了array,slice和map,接下來的時間讓我們一起研究一下這三者的差異以及用法.首先我們說一下array的部份: 1.數組的長度屬於數組的一部份,我們看下邊的例子 a:=[1]int{}和b:=[2]int{} a和b都是數組,但是他們的長度不同,在GO語言中會認為是不同的兩種類型,既然是不同的類型,那麼他們就不能進行比較或直接賦值的操作

Go 语言中的 Array,Slice,Map 和 Set

转自:https://se77en.cc/ Array(数组) 内部机制 在 Go 语言中数组是固定长度的数据类型,它包含相同类型的连续的元素,这些元素可以是内建类型,像数字和字符串,也可以是结构类型,元素可以通过唯一的索引值访问,从 0 开始. 数组是很有价值的数据结构,因为它的内存分配是连续的,内存连续意味着可是让它在 CPU 缓存中待更久,所以迭代数组和移动元素都会非常迅速. 数组声明和初始化 通过指定数据类型和元素个数(数组长度)来声明数组. // 声明一个长度为5的整数数组 var a

Set,List,Map的区别

Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 简单说下集合和数组的区别:(参考文章:<Thinking In Algorithm>03.数据结

高级数据类型(arrary、slice、map、ptr)

高级数据类型: 高级数据类型有数组.切片.map.指针.结构体.函数.接口.通道等,本文只介绍Arrary.Slice.map.ptr. 数组: (1)概念: 数组是同一种数据类型的集合.数组从声明时大小就已经确定,使用过程中可以修改值,但是数组的大小不可改变. (2)初始化 方法一:使用初始化列表来设置数组元素的值 var testArray[3]int var numArray=[3]int{4,5} 方法二:自行推断数组的长度的方式 var numArray=[...]int{4,5} 方

hash与map的区别联系应用(转)

一,hashtable原理: 哈希表又名散列表,其主要目的是用于解决数据的快速定位问题.考虑如下一个场景. 一列键值对数据,存储在一个table中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个个拿出来比较key啊,呵呵. 大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找.而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的. 具体如何做呢?大家是否有注意到前面说的话:“数组可以通过下标直接定位到相应的空间”

OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间使用.OpenGL3.0已经废弃此方法.每个glVertex与GPU进行一次通信,十分低效. glBegin(GL_TRIANGLES); glVertex(0, 0); glVertex(1, 1); glVertex(2, 2); glEnd(); 2.显示列表(glCallList) 每个gl

Java-list,set,map的区别

jdk中api的定义 Collection ├----List │ ├----LinkedList │ ├----ArrayList │ └----Vector │ └----Stack └----Set Map ├----Hashtable ├----HashMap ├ ├----LinkedHashMap └----WeakHashMap Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组

JS服务器端开发基础篇(Array.slice方法)

Array.slice方法在众多的JS数组中属于比较复杂的一个方法,搜索网络上很多资料都没有发现系统的总结.特别归纳如下,不完全处还希望各位批评指正. 格式: arrayObj.slice(start, [end]) 功能:返回指定数组的一个子数组,并不修改原来数组. 参数: start:必需.arrayObj的指定部分的开头. end:可选.arrayObj的指定部分的结尾. 数组使用来看,这个方法类似于串操作中的substr函数.但是,当参数为负数时,情况就复杂了. 具体情况详见下面的代码示

golang array, slice, string笔记

本来想写一篇关于golang io的笔记,但是在学习io之前必须了解array, slice, string概念,因此将在下篇写golang io. array: 数组的长度是该数组类型的一部分,例如var buffer [256]byte 的类型是[256]byte, len(buffer)总是返回256. slice: 一个slice描述一个数组中连续的一部分,例如var slice = buffer[100:250].slice也可以从slice产生,如var slice2 = slice