这是我参与「第五届青训营 」笔记创作活动的第9天.
切片:
切片可理解为:可变长度的数组.
切片是一个拥有相同类型元素的可变长度的序列.
切片底层是由数组实现的,增加了自动扩容的功能.
声明一个切片和声明一个数组类似,只要不添加长度即可.
var str []int
切片是引用类型,也可以用make函数来创建.
len := 10
var str2 []int = make([]int, len)
也可以简写为:
str3 := make([]int, len)
也可以指定容量,其中capacity为可选参数.
str4 := make([]int, length, capacity)
import "fmt"
func main() {
var str []int
//这时候还没有分配内存空间
str = append(str, 111)
str = append(str, 222)
fmt.Println(str)
len := 1
var str2 []int = make([]int, len)
str3 := make([]int, len)
//这时候已经分配好内存空间了
str2 = append(str2, 11)
str2 = append(str2, 22)
length := 1
capacity := 1
str4 := make([]int, length, capacity)
str4 = append(str4, 999)
fmt.Println(str2, str3, str4)
}
切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到数组,切片表达式的low和high表示一个索引范围(左包括,右不包括),得到的切片长度=high-low,容量等于得到的切片的底层数组的容量.
import "fmt"
func main() {
s1 := []int{1, 2, 3, 4, 5, 6}
s2 := s1[:3]
fmt.Printf("%v\n", s2)
s3 := s1[3:]
fmt.Printf("%v\n", s3)
s4 := s1[2:5]
fmt.Printf("%v\n", s4)
}
空(nil)切片:
一个切片在未初始化之前默认为nil,长度为0,容量为0.
var arr []int
fmt.Println(arr == nil)
fmt.Println(len(arr), cap(arr))
切片的遍历:
for i := 0; i < len(s1); i++ {
fmt.Println(s1[i])
}
for i2, v := range s1 {
fmt.Printf("i2:%v\n", i2)
fmt.Printf("v:%v\n", v)
}
结束啦,明天继续肝!