- slice表示一个拥有相同类型元素的可变长度序列
- 数组和slice是紧密相连的,每个非nil类型的slice都有属于他的底层数组,一个底层数组可以对应多个slice,slice可以用于访问数组的全部或部分元素
一、slice定义和使用
slice有三个重要的属性
- 指针:指向slice第一个元素的地址
- 长度:通过len获取,表示当前slice有多少个元素,不能超过slice的容量
- 容量:通过cap获取,容量的大小通常是slice的起始到结束的元素个数,如果使用超出了slice的容量,就会引发panic
slice的基本定义
// slice的默认值是nil,此时len和cap都为0
var a []int
a == nil // true
// 此时len cap都是0,但是不为nil
var b []int{}
b == nil // false
// 可以在定义的时候,指定slice里面的元素,此时len=3, cap=3
var c []int {1,2,3}
// 通过make创建make([]T, len, cap)
var d = make([]int, 3, 5) // {0, 0, 0}
// 等同于
var e = make([]int, 5)[:3]
先定义好数组,然后定义slice使用该数组作为底层数组
var months [...]string {1: "Jan.", /* ... */ 12: "Dec."}
// 定义slice
Q2 := months[4:7]
summer := months[6:9]
当前结构如下图所示:
如果slice的引用超过了该slice的cap,会panic,但是如果超过了len,最终slice会比原slice长
summer[:20] // panic
summer[:5] // => [June, July, August, September, October]
二、slice的比较
-
slice不像数组那样,可以直接通过
==
或者!=
进行比较,slice唯一可以比较的就是nil
-
标准库提供了
bytes.Equal
方法用于比较两个字节slice, 其他类型的slice比较需要自己写
三、append函数
append函数用于将元素追加到slice的末尾