切片
切片( slice )本身并非是动态数组或数组指针.它内部通过引用底层数组,设定相关属性将操作限制在指定数组上.
有三个属性: 底层数组指针, 长度, 容量.
长度指的是当前切片的长度,也就是底层数组已经存储的长度.
容量是切片可以使用的最大长度, 不一定是底层数组的长度.
定义和初始化
切片可以从已存在的数组上得到, 也可以直接创建.
因为切片是引用类型,直接创建时不会分配底层数组,所以使用make函数或显示初始化语句,来完成内存分配.
package main
import (
"fmt"
)
func main() {
arr := [...]int{1, 2, 3} // 数组
slc := arr[:] // 切片 以arr数组为底层数组创建的
slc_a := []int{1, 2, 3} // 切片 (显示初始化)
slc_b := make([]int, 3, 4) // 切片 (make函数)
fmt.Printf("%T\n", slc)
fmt.Printf("%T\n", slc_a)
fmt.Printf("%T\n", slc_b)
}
make 函数签名: func make(Type, size IntegerType) Type
切片的容量要大于等于长度.
package main
import (
"fmt"
)
func main() {
slc := make([]int, 3, 4) // 长度3 容量4
// slc := make([]int, 3) // 长度3 容量3
fmt.Printf("切片 len = %d, cap = %d\n", len(slc), cap(slc))
}
slice是引用类型, 初始化是nil.
package main
import (
"fmt"
)
func main() {
var slc []int // 仅定义
b := []int{} // 定义同时初始化
fmt.Println(slc == nil)
fmt.Println(b == nil)
}