Go语言切片是对数组的抽象?
Golang的数组长度不可改变,在特定场景中这样的集合不太适用,Go提供了一种灵活的,功能强悍的内置类型 “切片”(“动态数组”),与数组变比,切片的长度是不固定的,可以追加元素,在追加是可能使切片的容量增大。

定义切片

声明一个未指定大小的数组来定义切片

  1. var slice1 []type

切片不需要说明长度
或者使用make()函数来创建切片

  1. var slice1 []type = make([]type, len)
  2. slice1 := make([]type, len)

也可以指定容量,其中capacity为可选参数

  1. slice := make([]type, length, capacity)

切片初始化

  1. s := []int {1, 2, 3}

len() cap()

切片是可索引的,并且可以由len()方法获取长度
切片提供了计算容量的方法cap()可以测量切片最长可以达到多少

  1. package main
  2. import "fmt"
  3. func main() {
  4. var numbers = make([]int, 3, 5)
  5. printSlice(numbers)
  6. }
  7. func printSlice(x []int) {
  8. fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
  9. }

以上运行结果为 len=3 cap=5 slice=[0 0 0]

切片截取(同python

append() copy() 函数

如果想要增加切片的容量,必须创建一个新的更大的切片并把原切片的内容拷贝过来

  1. package main
  2. import "fmt"
  3. func main() {
  4. var numbers []int
  5. printSlice(numbers)
  6. numbers = append(numbers, 0) // 追加空
  7. numbers = append(numbers, 1) // 追加单个非空元素
  8. numbers = append(numbers, 2, 3, 4) // 追加多个元素
  9. numbers1 = make([]int, len(numbers), cap(numbers)*2) // 创建切片numbers1是numbers的2倍容量
  10. copy(numbers1, numbers) // 拷贝numbers的内容到numbers1
  11. }
  12. func printSlice(x []int){
  13. fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
  14. }

输出结果

  1. len=0 cap=0 slice=[]
  2. len=1 cap=1 slice=[0]
  3. len=2 cap=2 slice=[0 1]
  4. len=5 cap=6 slice=[0 1 2 3 4]
  5. len=5 cap=12 slice=[0 1 2 3 4]