Go基础知识点(七) | 青训营笔记

16 阅读1分钟

这是我参与「第五届青训营 」笔记创作活动的第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)
}
image.png

切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到数组,切片表达式的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)
}
image.png

空(nil)切片:

一个切片在未初始化之前默认为nil,长度为0,容量为0.

var arr []int
fmt.Println(arr == nil)
fmt.Println(len(arr), cap(arr))
image.png

切片的遍历:

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)
}
image.png image.png

结束啦,明天继续肝!