1、4种声明+判空

  1. package main
  2. import "fmt"
  3. func main() {
  4. //声明 slice1是一个切片,并且初始化,默认值是1,2,3,长度是3
  5. slice1 := []int{1,2,3}
  6. fmt.Println("len =",len(slice1),", array = ",slice1)
  7. //声明 slice2是一个切片,但没有给slice分配空间
  8. var slice2 []int
  9. fmt.Println("len =",len(slice2),", array = ",slice2)
  10. //make 开辟三个空间
  11. slice2 = make([]int,3)
  12. fmt.Println("len =",len(slice2),", array = ",slice2)
  13. slice2[0] = 222
  14. fmt.Println("len =",len(slice2),", array = ",slice2)
  15. //声明 slice3是一个切片,同时给slice3分配空间,3个空间,初始化为0
  16. var slice3 []int = make([]int,3)
  17. fmt.Println(slice3)
  18. //声明 slice4 是 slice3的简写
  19. slice4 := make([]int,3)
  20. fmt.Println(slice4)
  21. //判断一个slice是否为0
  22. if slice2 == nil{
  23. fmt.Println("空切片")
  24. }else{
  25. fmt.Println("非空")
  26. }
  27. }

2、cap 容量

image.png
1)通过append 追加元素,len值变成,cap值不变(直到len = cap)
2)当len = cap ,go底层会自动再开辟一个 cap空间,cap值会变化
image.png
image.png

  1. package main
  2. import "fmt"
  3. func main() {
  4. //声明一个切片,长度3,容量5
  5. slice1 := make([]int,3,5)
  6. fmt.Printf("原始:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)
  7. // 向切片追加一个元素,len = 4,cap =5
  8. slice1 = append(slice1,1)
  9. fmt.Printf("追加元素1:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)
  10. // 向切片追加一个元素,len = 5,cap =5
  11. slice1 = append(slice1,2)
  12. fmt.Printf("追加元素2:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)
  13. // 向切片追加一个元素,len = 6,cap =10
  14. slice1 = append(slice1,3)
  15. fmt.Printf("追加元素3:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)
  16. }

结果:
image.png

3、截取 和 copy

  1. package main
  2. import "fmt"
  3. func main() {
  4. s := []int{1,2,3,4}
  5. //切片截取,[0,3)
  6. s1 := s[0:3]
  7. fmt.Println("截取后s1=",s1)
  8. //s1 和 s 指向的是同一片内存区域,改了s1指向内存的数据,s切片取出来的值肯定也是改变了的
  9. s1[0] = 100;
  10. fmt.Println("修改s1的值后:---------")
  11. fmt.Println("s=",s)
  12. fmt.Println("s1",s1)
  13. //可以用copy方向,使两个指针指向不同的内存区域
  14. //make新开辟一块内存,s2指向新内存空间,s2 [0 0 0 0]
  15. s2 := make([]int,4)
  16. copy(s2,s) // s2 [1 2 3 4]
  17. fmt.Println("copy切片s后,s2=",s2)
  18. s2[0] = 200;
  19. fmt.Println("修改s2的值后:---------")
  20. fmt.Println("s=",s)
  21. fmt.Println("s2",s2)
  22. }

结果:
image.png