Golang中的数组切片
数组切片和数组在Go语言中不是同一种数据类型,但他们很相似,区别是数组只能是固定长度,而数组切片可灵活的改变长度。
var myArray [10]int //这是一个数组,长度固定
var mySlice []int //这是一个数组切片
数组切片的创建方式:
var myArray [5]int = [5] int{1,2,3,4,5} //创建一个长度为5的int数组
var mySlice []int=myArray[:] //基于数组创建一个数组切片
Go语言支持myArray[first:last]这样的方式来基于数组生成一个数组切片,这个方法很灵活:
mySlice = myArray[:]//基于myArray的所有元素创建
mySlice = myArray[:5]//基于myArray的前5个元素创建
mySlice = myArray[5:]//基于从myArray的第5个元素开始的所有元素创建
看个例子:
package main
import (
"fmt"
)
func main() {
var myArray [10]int = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var mySliceA []int = myArray[:]
var mySliceB []int = myArray[:5]
var mySliceC []int = myArray[5:]
fmt.Println(mySliceA, mySliceB, mySliceC)
}
程序输出为:
[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4] [5 6 7 8 9]
除了这种方式外,还可以使用make()
函数创建数组切片;
mySlice := make([]int,5,10)
第二个参数为起始的元素个数,第三个参数为预留的存储空间(省缺);为什么要预留空间这里就不细说,当数组切片的元素超过预留元素时,它会自动申请新的空间。
可使用cap()
函数查看数组切片的预留空间,使用len()
函数查看数组切片的元素个数。
mySliceD := make([]int, 5, 10)
fmt.Println(cap(mySliceD), len(mySliceD))
程序将打印10,5
遍历数组切片:
其方法与数组一样,且支持range:
for i, v := range mySlice {
fmt.Println("mySlice[", i, "] =", v)
}
为数据切片增加新的元素,可使用append()
函数。
mySliceA = append(mysliceA,1,2,3)
var myArray [10]int = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var mySliceA []int = myArray[:]
mySliceA = append(mySliceA, 77, 88, 99)
fmt.Println(mySliceA)
append()
方法的第二个参数是一个不定参数,我们可以直接追加一个数组切片:
mySliceA = append(mySliceA, []int{77, 88, 99}...)
这里[]int{77,99,99}是一个数组切片,并不是一个数组,因为没有为其指定长度。
数组切片后面跟有三个点 …,这是Golang中的一个语法糖,相当于将数组切片中的所有元素打散传入。
除了上述的几种创建方法外,还可以基于数组切片创建,将其当成数组一样即可。