数组
定义:数组是相同类型的元素集合(值类型),这种类型可以是任意的原始类型例如整型、字符串或者自定义类型
声明和初始化 var a [3]int //声明长度为3的整型的数组,并且默认值为0 var b [3]int = [3]int{1,2,3} //长度为3的整型的数组,并进行初始化 c := [...]int{1,2,3} //根据后面赋值数量自动初始化数组长度
取值和赋值 a[0]=1 //赋值 var i int = a[0] //取值
遍历数组 //方式1: for i:=0;i<=len(a);i++{ fmt.Println(a[i]) } //方式2: for index,val := range a{ fmt.Println(val) //index 为下标,val 为对应的值 }
二维数组:
声明 a := [2][3]int{ //前面2是行数,后面3是列数 {1,1}, {2,2}, {3,3} } 遍历 for i,val := range a{ for j,val2 := range val{ //val 就是该数组的一维数组数据 fmt.Println(val2) } }
切片
定义:切片是对数组的一层封装(引用类型),与数组相比切片的长度是不固定的,可以追加元素
声明 var a []int //定义一个空切片,此时 a 的值为 nil,所以声明后需要初始化后才可以进行赋值等操作 初始化 //方式1 从已存在的数组进行切片 arr[start:end] 创建一个包含 start 到 end-1 的切片(也可以 arr[start:],arr[:end],arr[:]) a := [4]int{1,2,3,4} b:= a[0:2] //从数组a的下标 0 到 1 进行切片获取数据,此时切片的长度为2,容量为4(为数组的长度-start值) //方式2 直接设置初始化数据 b := []int{1,2,3} //空切片,值为 nil,不可进行修改或赋值操作,但是可以 append,并且 append 的扩容策略为原容量的翻倍(1,2,4,8...) c:=[]int
基本操作:
修改 a := [4]int{1,2,3,4} b:= a[:] b[0]=100 fmt.Println(a) //输出值为 {100,2,3,4},说明切片是对数组的一个引用 复制 a := [4]int{1,2,3} b := [4]int{4,5,6,7} copy(a,b) //copy 为内置函数,将 b 复制到 a,结果 a 为 {4,5,6} 将一个切片追加到另一个切片中 a:=[]int{1,2,3} b:=[]int{4,5,6} a=append(a,b...) //...的意思为将b切片进行展开元素,逐一将元素追加到切片a的末尾
mark创建切片 (make为内建类型slice,map和channel分配内存,new用于各种类型的内存分配,new返回是一个指针) //length默认长度 capacity容量,其中 capacity 可以理解为最大长度,也就是可对该切片通过 append 方法增加数据的最大长度 a := make([]int,length,capacity) //长度和容量说明 len(a) 方法获取切片长度 cap(a) 方法获取切片容量 a=append(a,value) 追加数据,并且如果达到容量值后并继续追加,容量值会进行翻倍处理(根据设置 capacity 的倍数),此时该切片的内存地址也会发生改变
对切片进行切片 a:= [...]int{1,2,3,4,5} b:=a[1,3] //b为{2,3},长度为2,容量为4 //从b再进行切片 b=b[:cap(b)] //b为{2,3,4,5} 长度为4,容量为4