Go的数组长度是固定的,不能改变大小

[n]TnT
var a [10]int // 定义了长度为10的int型数组
b:= [5]int{1,2,3} // 短声明,没有写的默认补零,因此b实际上为[1,2,3,0,0]
c:=[]int{1,2,3} // c长度为3,实际上c不是数组而是切片

访问数组

fmt.Println(b[0]) // 输出b数组的第一个数

切片(Slice)

[]TT
var s1 []int=b[1:3] // 定义int型的切片并赋值为b的第2和第3个元素
s2:=b[0:4] // 短声明,赋值为b的第1到第4个元素
s3:=b[:4] // 等价于s2
s4 := b[:] // 取b的所有数作为切片
s5 := b //s5是一个与b相同的数组
fmt.Print(s1[1]) // 输出为b的第三个元素,即3

注意切片为左闭右开区间,包括左边界不包括右边界

切片可以看作数组的一种引用,切片本身不储存任何数据,只是引用现有数组的一部分,相当于为现有数组的一部分取了个化名,通过切片可以修改原数组,如果两个切片同时指到一个数组,数组本身的内容改变则两个切片引用的内容也会改变。

len()cap()

例如:

a :=[10]int{0,1,2,3,4,5,6,7,8,9}
sa:=a[2:5] // 此时其内容为[3,4,5],len为3,但cap为8,容量为从切片的起始点2到a的原长度10,即为8
sa=sa[0:6] // 重新指定了长度,内容为[3,4,5,6,7,8],即从原数组的切片起点向后推6个数
//切片的长度不能超过其容量,如sa=sa[0:9]就是不对的,因为其容量cap只有8
//切片的容量是可以减少的,切片的左端向右调整便会减少其长度,例如:
sa=sa[3:6]// 此时其内容为[6,7,8],len=2,切片起始点向右调整了3个位置,因此这次cap=5
//调整切片的右边界只会改变切片的长度,而不改变其起始点,故容量不变
//调整切片的左边界会改变切片的起始点,故容量会变,由于不能取负数,因此左边界只能向右移动,容量只减不增