前言
上一篇将go的初级语法(主要是变量和常量的内容),基础数据类型简单说了一下,到了这里大家一般都已经了解到了go的初级基础,那么对于任何一门语言数组是离不开的,数组的一系列操作在语言代码中有着很大的不同,相比于大多数语言,go的数组显得局限,因为在go中数组是一种值类型,一旦被定义,他的容量必须是固定,所以想要对其进行扩容就是不可能的,为了解决这个比较尴尬的场景,go团队引入了切片的概念,而切片的功能比其他语言的数组还要厉害几分。
数组
1.一维数组的定义与使用
1.1.定义一个数组
数组的格式一般为:
var 变量名[数组长度size] 变量类型
也可为:
var 变量名 = []变量类型{........}
{}里的内容就是数组元素,[]里还是数组长度,可写可不写,写的时候,后面的元素个数一定不要大于[]的长度数值,不解的时候,go语言自己可以根据元素个数来推出数组长度的多少
特殊命法
变量名 := [...]变量类型{}
变量名 :=[...]变量类型{下标:对应下标的值}
具体看下面的实例
数组的几种其他创建形式:
1.2基于一维数组的遍历操作
访问数组元素
这个就不解说了,直接附上代码实例
数组的长度在go中不是length函数而是len函数,这里提醒一下
遍历数组
for循环
for...range遍历
注意如果仅仅想要值value,可以省略index用_来代替
for _,v=range a{
fmt.Println(v)
}
2.多维数组
格式一般为:
var 变量名 [size1][size2]....[sizeN] 变量类型
var 变量名 [1][2][3] int这里的三个维度必须是同一类型的,大多数都用于int
一维数组:存储的多个数据是数值本身 a :=[3]int{1,2,3} 二维数组:存储的是一维的一维 a := [3][4]int{{},{},{}} 该二维数组的长度,就是3。 存储的元素是一维数组,一维数组的元素是数值,每个一维数组长度为4。 多维数组:。。。
直接附上实例代码:
对于&a在后面指针时会讲,知道是地址就行
对于数组的排序等操作,我觉得大家可以自己去搜一些讲的更细的,牵扯到算法,已经不仅仅限于go语言了,有机会可以看看数据结构的知识(java的就行重在理解)
切片
怎么说呢,其实它就是对数组的抽象,你可以叫它动态数组,切片本身是没有数据的,只是对现有数组的引用,所以就不需要设置长度了,就很自由。
1.定义切片
一般格式为:
var 切片名称 []定义的类型
或者用make函数make([]T,len,cap)len就是切片长度,cap是切片容量
var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)
切片的初始化
最直接的方式是s[0]=1 s[1]=2.......s[n]=n+1
s := [] int{1,2,3}
s:= arr[startIndex:endIndex]
在arr中将下标从startIndex道endIndex-1(前闭后开)的元素截下来成为一个新切片
如果省略endIndex不写则说明一直到arr的最后一个元素,同样省略startIndex不写就默认为从第一个元素开始,两个都不写,就是复制了一遍
对于切片的修改
切片没有自己的数据,所以对于它的任何修改都反映在底层数组里,而且如果多个切片公用一个底层数组所有对于切片的修改都会在数组里显现
切片的长度与容量
len长度就是表示切片中元素的数量,cap容量表示创建切片索引时底层数组的元素数量,怎么说呢,在make函数里定义
make([]T.3,5)
len=3表示有三个元素,cap=5表示他的最大容量但是元素不一定必须是5相反与len的值有关,这个切片每个元素没有给值,所以输出的值默认为[0,0,0]
一个没有初始化的切片默认为nil(就是java等语言的null),默认长度为0
下面给个统一的例子示范一下
2.append()和copy()函数
append()函数就是向原切片追加一个或多个元素,返回的依然是原类型的切片,由于append会改变切片底层数组的内容,所以会影响到和这个切片公用一个底层数组的其他切片,但是如果这个切片没有剩余空间(cap-len)==0时,此时将动态分配到新的数组空间,就不会影响到原数组的内容了,所以其他切片就不受影响了
copy()函数就是从原切片的src复制元素到目标切片中,并返回复制元素的个数,但是这两个切片之间没有联系,也就是copy()是不会给他们两个建立联系,从而原切片发生变化时,不会影响到copy它的那个目标切片
举个实例吧