- 在go语言中,数组的长度不可改变,在某些场景中不适用。便提供了一种灵活的动态数组,即切片。
- 切片的长度是不固定的,可以追加元素,可使容量变大
- 无需设定长度
func main() {
//定义切片,和数组很像,不指定长度即为切片
var arr1=[4] int{1,2,3,4} //数组
var arr=[] int{1,2,3,4,5,6} //切片
fmt.Println(arr1,arr)
}
1.make()创建切片
func main() {
//创建格式:make([]type,len,cap)
arr:=make([]int,5,10) //长度为5 容量为10
fmt.Println(len(arr),cap(arr))
}
2.追加元素与切片扩容
func main() {
//元素追加
arr:=make([]int,0,6)
fmt.Println(len(arr),cap(arr)) //长度为0,容量6
arr=append(arr,1,2,3,4,5 ) //追加了5个元素
fmt.Println(len(arr),cap(arr)) //长度为5,容量6
//切片扩容
arr=append(arr,1,2,3,4,5,7,8,9 ) //追加后自动扩容
fmt.Println(len(arr),cap(arr)) // 长度为5,容量14
//将切片引入至另一个切片
fmt.Println(arr)
arr1:=[]int{100,200,300} //[1 2 3 4 5 1 2 3 4 5 7 8 9]
arr=append(arr,arr1... ) //将arr1中的元素追加到arr中
fmt.Println(arr) //[1 2 3 4 5 1 2 3 4 5 7 8 9 100 200 300]
}
3.切片遍历
for i := 0; i < len(arr); i++ {
fmt.Println(arr[i])
}
for i, v := range arr {
fmt.Println(i,v)
}
4.切片底层复制扩容逻辑
func main() {
arr :=[]int{1,3,4}
arr1 :=make([]int,len(arr),cap(arr)*2)
copy(arr1,arr) //将arr元素复制给arr1
fmt.Printf("%d,%d,%v\n",len(arr1),cap(arr1),arr)//3,6,[1 3 4]
}
5.深拷贝与浅拷贝
深拷贝:拷贝是数据的本身
浅拷贝:拷贝的是数据地址,多个变量同时指向一个地址