数组
数组范围大小固定且内存地址连续,不能进行添加范围外的元素,分片可以
未初始化的元素默认为0
变量名本质是使用方便的占位符,用于引用计算机内存地址。
数组声明
数组声明一定要指定长度,且不可改变
var name [20] int
name :=[5] int {10,20,30,40,50}
name :=[...] int {10,20,30,40,50}
数组传参
-
传的数组长度必须一致
-
函数传数组是开销很大的操作,且总是以值的方式传递的,无论数组有多长,都会全部传递过去,所以开发中尽量用切片传参
切片
- 切片是一种数据结构,和数组不一样!!!
- 切片函数传参也是复制了值,但是由于切片实际上尺寸很小,只有24个字节(三个字段各8个字节),不会复制底层数据,效率很高
- 内部实现: 切片是对底层数组进行了抽象,并提供相关的操作方法,切片有三个字段,分别为:指向底层数组的指针、切片长度(可以访问的个数)、切片容量(允许增长的个数)
创建切片
在[]中指定的大小,就不是切片,而是数组了
slice :=make ([] string,5) //容量和长度都是5
slice :=make ([] string,3,5) //长度3,容量5
slice :=[] string{"Green","Red","Blue"}
var slice []int //创建nil切片
newSlice:=slice[1:3] //使用切片创造切片
append
- 用于增加切片的访问个数,有可能增加容量,也可以不增加
- 下面的代码#3 就会增加newSlice的长度同时修改slice里面的40为50
slice :=[] int {10,20,30,40}
newSlice :=slice[1:3]//长度为2(3-1),容量为3(4-1)
newSlice=append(newSlice,50)
- 上面是切片容量在底层数组的范围内的情况,如果使用了append,但是超过了底层数组的长度,那么就是重新创建一个底层数组,且容量是原来的2倍(1000之内会成倍增加)