数组切片就像一个指向数组的指针,它拥有自己的数据结构,不仅仅是指针,数组切片的数据结构可以抽象为以下三个变量:
- 一个指向原生数组的指针
- 数组切片的元素个数
- 数组切片已分配的存储空间
从底层实现来看,数组切片实际上还是通过使用数组来管理元素,这个有点像C++中数组与vector的关系,并且可以被随意传递而不会导致所管理的元素被重复复制
package arrSlice
import "fmt"
//创建数组切片主要有两种方法-基于数组创建和直接创建
func printArr(mySlice []int ) {
fmt.Println("数组切片的元素是:\n")
for _,v := range mySlice {
fmt.Print(v," ")
}
fmt.Println("\n")
}
//基于数组创建
func CreatArrSliceFromArr() {
var arr [10]int
for i,_ := range arr{
arr[i] = i
}
//将数组arr的所有元素都给数组切片赋值
var mySlice1 []int = arr[:]
printArr(mySlice1)
//将数组arr的前五个元素给数组切片赋值
var mySlice2 []int = arr[:5]
printArr(mySlice2)
//将数组arr的从第五个元素之后的元素赋值给数组切片
var mySlice3 []int = arr[5:]
printArr(mySlice3)
}
//直接创建
func CreatArrSlice() {
//创建一个初始元素个数为5的数组切片,元素初始值为0,
mySlice1 := make([]int,5)
printArr(mySlice1)
//创建一个初始元素个数为5的数组切片,元素初始值为0, 并预留10个元素的存储空间
mySlice2 := make([]int,5,10)
printArr(mySlice2)
//直接创建并初始化包含5个元素的数组切片
mySlice3 := []int{1,2,3,4,5}
printArr(mySlice3)
}
//基于数组切片创建数组切片
func CreateArrSliceFromSlice() {
var mySlice1 = []int{1,2,3,4,5}
mySlice2 := mySlice1[:]
printArr(mySlice2)
}
func SliceAppend() {
//创建一个初始元素个数为5的数组切片,元素初始值为0, 并预留10个元素的存储空间
var mySlice1 = make([]int,5,20)
var mySlice2 = []int{1,2,3,4,5}
fmt.Println("len(mySlice1) = ",len(mySlice1),"\n")
fmt.Println("cap(mySlice1) = ",cap(mySlice1),"\n")
//元素追加
//直接在数组切片后面追加元素
mySlice1 = append(mySlice1,1,2,3,4)
printArr(mySlice1)
//直接在数组切片后追加另外一个数组切片
mySlice1 = append(mySlice1,mySlice2...)//加省略号表示把mySlice2的所有元素都追加到mySlice1中
}
//通过copy函数可以直接对数组切片进行拷贝,但是如果两个数组切片不一样大,就会按照其中小的那个切片大小来复制
func SliceCopy() {
mySlice1 := []int{1,2,3,4,5,6,7,8}
mySlice2 := []int{0,0,0,0,0}
copy(mySlice1,mySlice2)
printArr(mySlice1)
}
代码运行结果: