docs: Slice 切片

This commit is contained in:
Shikong 2021-09-18 01:11:16 +08:00
parent aed95370cf
commit 41f6051df6

108
base/slice/main.go Normal file
View File

@ -0,0 +1,108 @@
package main
import "fmt"
func main() {
// 定义一个 int 切片
var s1 []int
// 定义并初始化切片
var s2 = []int{1, 2, 3}
fmt.Printf("s1: %T %+v\n", s1, s1)
fmt.Printf("s2: %T %+v\n", s2, s2)
fmt.Println("=========================================================")
// 未初始化时为 nil
fmt.Printf("s1 == nil : %t\n", s1 == nil)
fmt.Printf("s2 == nil : %t\n", s2 == nil)
fmt.Println("=========================================================")
// 长度和容量
fmt.Printf("s1 长度: %d, 容量: %d\n", len(s1), cap(s1))
fmt.Printf("s2 长度: %d, 容量: %d\n", len(s2), cap(s2))
fmt.Println("=========================================================")
// 从数组获取切片
a1 := [...]int{0, 1, 2, 3, 4, 5}
fmt.Printf("a1: %T %+v\n", a1, a1)
// 基于数组进行切割
// 数组[起始下标:截止下标]
// 从起始下标开始 到截止下标为止(不包含) 左闭右开
// 切片的容量是指底层数组的容量
// 切片容量的大小是 从 切片的第一个元素下标 到 被切割的数组/切片最后一个元素下标 的长度
s3 := a1[1:4]
fmt.Printf("s3: %T %+v\n", s3, s3)
fmt.Printf("s3 长度: %d, 容量: %d\n", len(s3), cap(s3))
// a1[:4] => a1[0:4]
s4 := a1[:4]
fmt.Printf("s4: %T %+v\n", s4, s4)
fmt.Printf("s4 长度: %d, 容量: %d\n", len(s4), cap(s4))
// a1[4:] => a1[4:最后一个下标] => a1[4:len(a1)]
s5 := a1[4:]
fmt.Printf("s5: %T %+v\n", s5, s5)
fmt.Printf("s5 长度: %d, 容量: %d\n", len(s5), cap(s5))
// a1[4:] => a1[4:最后一个下标] => a1[4:len(a1)]
s6 := s5[1:]
fmt.Printf("s6: %T %+v\n", s6, s6)
fmt.Printf("s6 长度: %d, 容量: %d\n", len(s6), cap(s6))
fmt.Println("=========================================================")
// 切片 是引用类型 内部都指向底层的同一个数组
fmt.Printf("a1: %T %+v ", a1, a1)
fmt.Printf("s5: %T %+v ", s5, s5)
fmt.Printf("s6: %T %+v\n", s6, s6)
// 修改底层数组的值
a1[len(a1)-1] = 666
fmt.Printf("a1: %T %+v ", a1, a1)
fmt.Printf("s5: %T %+v ", s5, s5)
fmt.Printf("s6: %T %+v\n", s6, s6)
fmt.Println("=========================================================")
// 使用 make 创建切片
// make([]类型,长度,容量) 容量不填时 默认 与 长度相同
s7 := make([]int, 5, 10)
fmt.Printf("s7: %T %+v\n", s7, s7)
fmt.Printf("s7 长度: %d, 容量: %d\n", len(s7), cap(s7))
s8 := make([]int, 0, 10)
fmt.Printf("s8: %T %+v\n", s8, s8)
fmt.Printf("s8 长度: %d, 容量: %d\n", len(s8), cap(s8))
fmt.Println("=========================================================")
// 切片 为引用类型 会被修改
s9 := []bool{true, true, true}
s10 := s9
fmt.Printf("s9: %T %+v\n", s9, s9)
fmt.Printf("s10: %T %+v\n", s10, s10)
s10[1] = false
fmt.Printf("s9: %T %+v\n", s9, s9)
fmt.Printf("s10: %T %+v\n", s10, s10)
fmt.Println("=========================================================")
// 切片遍历
// for...i 循环时需使用 len() 而不能使用 cap()
for i := 0; i < len(s10); i++ {
fmt.Printf("%d, %v ", i, s10[i])
}
fmt.Println()
for i, v := range s10 {
fmt.Printf("%d, %v ", i, v)
}
}