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中的一个语法糖,相当于将数组切片中的所有元素打散传入。

除了上述的几种创建方法外,还可以基于数组切片创建,将其当成数组一样即可。


如需转载,请注明出处,本文地址:https://www.perfcode.com/p/1477.html