go切片

切片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]
}
原文地址:https://www.cnblogs.com/HachikoT/p/13742115.html