数组

定义:数组是相同类型的元素集合(值类型),这种类型可以是任意的原始类型例如整型、字符串或者自定义类型

声明和初始化
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