本人从事Go语言开发多年,目前主要从事云计算相关开发。
写本公众号的目的主要是对自己的过往知识进行梳理,也希望可以帮助大家学习~
后续会推出Go语言源码学习系列和web开发系列等,欢迎大家关注。
前面我们提到:常量和变量都是数据的一种载体,数据通过不同的运算符参与运算时,对计算的流程进行一定程度的控制便是流程控制
当数据的量较少时,通过常量和变量进行存储可以进行计算,但是当我们编写更加复杂、数据量更多的程序时,需要对数据进行相应的存储,便是本篇的主题——内置容器
上面我们介绍了内置容器的作用以及由来,那么Go语言主要包括哪些内置容器呢?
思维逻辑图如下:
Go语言中内置容器主要包括:数组、切片和映射三种内置容器,下面我们对这三种容器进行相应的介绍
数组是一种用于存储一组相同类型而且长度固定的数据的数据结构
解释:由于我们还未对数组赋值,所以结果为空数组
标准格式:var 数组名 = [数组长度]数据类型{数组的每一项}
解释:由于我们在声明的同时便对数组进行了赋值,所以结果不再是空数组
由于数组声明后大小固定,不能删除,只能修改,所以数组的操作主要包括:选读取数组中的某个数据、修改数组中的某个数据以及遍历整个数组
1)读取数组中的某个数据和修改数组中的某个数据
数组数据的读取主要通过下标的方式,下标从0开始,到数组长度减1结束
2)遍历数组
像1)中那样可以实现对数组的部分遍历,但是当对整个数组进行遍历时,就不够方便和简洁;故可以通过上篇循环控制的for循环进行遍历
上面的方式同样可以实现对数组的遍历,但是在Go语言中,引入了一个非常常用的关键字:range,可以和for搭配实现对数组、切片和映射的遍历
解释:通过range关键字进行遍历时,会返回两个值,分别为k和v,k代表该数组当前迭代时的数组下标,v代表该数组当前迭代时该下标对应的元素值
切片是Go语言中另一种功能强大而且非常方便的数据结构
与数组相似,切片也是对同种数据类型元素的连续集合,但是切片自身不存储任何元素,它仅仅是对现有数组的引用(下文有证明)
切片的声明方式主要有三种:1.从数组声明一个切片;2.从切片声明一个新的切片;3.直接声明一个新的切片;
1)从数组声明一个切片
格式如下:数组名 [起始位置:结束位置]
解释:首先声明了一个名为nums的数组,然后通过数组声明了一个名为numSlice的切片
注:1. 声明的切片包括的元素不包含结束位置对应的数组元素;2. 本例还对上面提到的切片是数组的引用进行了证明,由于内存中数组的地址为第一个元素的地址,所以对比数组的第一个元素地址和切片的第一个元素地址,发现地址相同,故切片是数组的引用;
2)从切片声明一个切片
格式如下:切片名[起始位置:结束位置]
解释:从切片numSlice声明了一个新的切片numSlice2,而且发现numSlice切片仍然是数组的引用
注:以上两种声明生成切片的方式,由于归根到底都是通过一个已经初始化后的数组进行声明,所以声明的同时就完成了赋值,故只需声明便可生成带有数据的切片
3)直接声明一个切片
标准格式:var 切片名 []数据类型
注:直接声明一个切片的格式与声明也给数组的格式的区别:[]中是否包括了长度,有则为数组,空则为切片
由于该方式是直接声明,我们没有对切片进行赋值,所以需要初始化
直接声明一个切片的初始化方式包括两种:a) 和数组相似的初始化方式;b) make()函数初始化;
b) make()函数初始化
使用make()函数初始化,需要先以直接声明一个切片的方式声明一个切片
格式如下:make([]数据类型, 切片长度,切片容量)
注:长度:切片中实际存在的元素的个数,len()函数可以获取当前切片的长度;容量:从切片的第一个元素开始到其引用的底层数组中的最后一个元素的个数,cap()函数可以获取当前切片的容量;
解释:a. 切片的长度:由于切片不包括声明时的结束位置,所以numSlice切片只包括下标为0和1的元素,故长度为2;b. 切片的容量:从切片的第一个元素1,到底层数组的最后一个元素3分别为:1,2,3,个数为3,故容量为3;
上面是对切片的长度和容量进行了相应的介绍,下面我们回归到make()函数的切片初始化
解释:切片在初始化后,自动填充了该数据类型的默认值:int默认值为0,string默认值为空字符串,bool为false;
由于切片少了固定长度的约束,所以可以对切片进行增删改查,查即为遍历
1) 为切片增加元素
为切片增加元素可以通过append() 函数完成,当切片的长度等于切片容量时,下一次使用append()函数添加元素,容量会以2倍的方式扩容。但是要注意:当切片的长度小于数组的长度时,而且切片的最后一个元素的下标不等于数组的最后一个元素的下标时,对切片进行增加元素操作时,会对底层数组的元素进行修改
注意:a) 当为numSlice增加元素4时,由于切片的长度小于数组的长度,而且切片的最后一个元素的下标为1,不等于数组的最后一个元素的下标2,所以对切片增加4时,会导致数组num的修改变为[1,2,4];b) 当切片的长度等于切片容量时,下一次使用append()函数添加元素,容量会以2倍的方式扩容,所以当增加5时切片扩容为6;c) 当切片增加5时,由于切片长度已经等于数组的长度,所以不会再改变新的数组的元素值;
2) 为切片删除元素
Go语言中没有提供直接删除元素的方法,但是可以通过append函数完成
解释:示例中append(numSlice[0:1],numSlice[2:]...)是一种简写方式,等效于append(numSlice[0:1],numSlice[2],numSlice[3])
那么删除切片的元素时,会影响底层数组的元素值吗?
所以:删除切片元素时,会导致底层数组的元素值的变化
刚刚介绍的是删除单个或者几个元素,我们可以通过拼接的方式删除,当要全部删除时,可以直接将切片的起始位置和结束位置均设为0实现
3) 为切片修改元素
注:修改切片的元素可以通过切片的下标直接进行修改,但是注意修改切片的元素也会对底层数组进行修改
结果如下:
1)映射是一种无序的键值对集合
2)映射的初始化
映射的初始化有两种方式:声明时进行赋值初始化和使用make()函数初始化
b) make()函数初始化
格式如下:make(map[键数据类型]值数据类型,map容量)
2)删除键值对
map中删除键值对可以通过delete()函数实现
3)遍历键值对
map的遍历和数组以及切片的遍历方式一样,通过for循环和range关键字实现
结果如下:
到此关于Golang内置容器的分享就结束了~
此篇为Go语言基础系列分享第四篇,欢迎大家关注本公众号《Go开发与计算机技术》,Go语言基础系列学习不迷路。