diff --git a/base/slice/main.go b/base/slice/main.go new file mode 100644 index 0000000..1343e76 --- /dev/null +++ b/base/slice/main.go @@ -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) + } +}