切片slice
切片slice是对数组array的引用,多个slice可以指向相同的数组,并且支持动态扩展长度,这一点类似于C++中的std::vector<T>
:
创建slice
序号 | 方式 | 代码示例 |
---|---|---|
1 | 直接声明 | var slice []int |
2 | new | slice := *new([]int) |
3 | 字面值 | slice := []int{} |
4 | make | slice := make([]int, len, cap) |
5 | 从数组或切片中截取 | slice := array[0:5]或slice := sourceSlice[0:5] |
nil切片和空切片
nil切片和空切片的len和cap都为0,不同的是nil切片中保存的指针为0,而空切片中的指针则指向一个固定的值(预先设定好的空数组对象地址);所以nil切片和nil比较为true
,空切片和nil比较为false
:
func main() {
s1 := []int{}
var s2 []int
fmt.Println(s1 == nil) //false
fmt.Println(s2 == nil) //true
}
append追加元素
slice进行元素的追加的时候,使用系统的append函数,这时行为和C++中的std::vector<T>
的push_back
类似,即超出当前容量后,会以2倍的增速重新申请空间,得到一个新的底层数组:
func main() {
s1 := []int{}
s1 = append(s1, 1, 2, 3)
fmt.Println(s1) // [1 2 3]
}