Go语言切片是对数组的抽象?
Golang的数组长度不可改变,在特定场景中这样的集合不太适用,Go提供了一种灵活的,功能强悍的内置类型 “切片”(“动态数组”),与数组变比,切片的长度是不固定的,可以追加元素,在追加是可能使切片的容量增大。
定义切片
声明一个未指定大小的数组来定义切片
var slice1 []type
切片不需要说明长度
或者使用make()函数来创建切片
var slice1 []type = make([]type, len)
slice1 := make([]type, len)
也可以指定容量,其中capacity为可选参数
slice := make([]type, length, capacity)
切片初始化
s := []int {1, 2, 3}
len() cap()
切片是可索引的,并且可以由len()方法获取长度
切片提供了计算容量的方法cap()可以测量切片最长可以达到多少
package main
import "fmt"
func main() {
var numbers = make([]int, 3, 5)
printSlice(numbers)
}
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
以上运行结果为 len=3 cap=5 slice=[0 0 0]
切片截取(同python
append() copy() 函数
如果想要增加切片的容量,必须创建一个新的更大的切片并把原切片的内容拷贝过来
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
numbers = append(numbers, 0) // 追加空
numbers = append(numbers, 1) // 追加单个非空元素
numbers = append(numbers, 2, 3, 4) // 追加多个元素
numbers1 = make([]int, len(numbers), cap(numbers)*2) // 创建切片numbers1是numbers的2倍容量
copy(numbers1, numbers) // 拷贝numbers的内容到numbers1
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
输出结果
len=0 cap=0 slice=[]
len=1 cap=1 slice=[0]
len=2 cap=2 slice=[0 1]
len=5 cap=6 slice=[0 1 2 3 4]
len=5 cap=12 slice=[0 1 2 3 4]