切片的声明|创建

代码

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. )
  7. // 切片定义声明
  8. func main() {
  9. log.SetOutput(io.MultiWriter(os.Stdout))
  10. log.SetFlags(log.Lshortfile)
  11. //声明 slice1 是一个切片,并且初始化,默认值是1, 2, 3。长度len是3
  12. slice1 := []int{1, 2, 3}
  13. // 声明 slice2 是一个切片,但是并没有给slice分配空间
  14. var slice2 []int
  15. slice2 = make([]int, 5) //开辟5个空间,默认值是0
  16. //声明 slice3 是一个切片,同时给 slice3 分配空间,6个空间,初始化值是0
  17. var slice3 []int = make([]int, 6)
  18. //声明 slice4 是一个切片,同时给 slice 分配空间,8个空间,初始化值是0,通过 := 推导出 slice5 是一个切片
  19. slice4 := make([]int, 8)
  20. log.Printf("len = %d, slice = %v, type= %T\n", len(slice1), slice1, slice1)
  21. log.Printf("len = %d, slice = %v, type= %T\n", len(slice2), slice2, slice2)
  22. log.Printf("len = %d, slice = %v, type= %T\n", len(slice3), slice3, slice3)
  23. log.Printf("len = %d, slice = %v, type= %T\n", len(slice4), slice4, slice4)
  24. // // 循环遍历数组
  25. // for _, vaule := range dynamicArray1 {
  26. // log.Println("value = ", vaule)
  27. // }
  28. }

输出

  1. main.go:28: len = 3, slice = [1 2 3], type= []int
  2. main.go:29: len = 5, slice = [0 0 0 0 0], type= []int
  3. main.go:30: len = 6, slice = [0 0 0 0 0 0], type= []int
  4. main.go:31: len = 8, slice = [0 0 0 0 0 0 0 0], type= []int

切片中的 make

  • 切片如果在声明时没有赋值, 那么就需要 make 来创建内存指针

    代码

    ```go package main

// 切片与make import ( “io” “log” “os” )

func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile)

  1. v1 := make([]int, 3, 4) //超出容量时 以make时的德第二个参数 5 来开辟空间
  2. v2 := make([]int, 3) //超出容量时 以make时的倍数开辟空间, 也就是 3
  3. log.Printf("len=%d, cap=%d, slice=%v\n", len(v1), cap(v1), v1)
  4. v1 = append(v1, 1)
  5. log.Printf("len=%d, cap=%d, slice=%v\n", len(v1), cap(v1), v1)
  6. v1 = append(v1, 2)
  7. log.Printf("len=%d, cap=%d, slice=%v\n", len(v1), cap(v1), v1)
  8. v2 = append(v2, 100)
  9. log.Printf("len=%d, cap=%d, slice=%v\n", len(v2), cap(v2), v2)

}

  1. <a name="cssIs"></a>
  2. ### 输出
  3. ```go
  4. main.go:17: len=3, cap=4, slice=[0 0 0]
  5. main.go:19: len=4, cap=4, slice=[0 0 0 1]
  6. main.go:22: len=5, cap=8, slice=[0 0 0 1 2]
  7. main.go:25: len=4, cap=6, slice=[0 0 0 100]

切片的截取

代码

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. )
  7. func main() {
  8. log.SetOutput(io.MultiWriter(os.Stdout))
  9. log.SetFlags(log.Lshortfile)
  10. /* 创建切片 */
  11. numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
  12. printSlice(numbers)
  13. /* 打印原始切片 */
  14. log.Println("numbers ==", numbers)
  15. /* 打印子切片从索引1(包含) 到索引4(不包含)*/
  16. log.Println("numbers[1:4] ==", numbers[1:4])
  17. /* 默认下限为 0*/
  18. log.Println("numbers[:3] ==", numbers[:3])
  19. /* 默认上限为 len(s)*/
  20. log.Println("numbers[4:] ==", numbers[4:])
  21. numbers1 := make([]int, 0, 5)
  22. printSlice(numbers1)
  23. /* 打印子切片从索引 0(包含) 到索引 2(不包含) */
  24. number2 := numbers[:2]
  25. printSlice(number2)
  26. /* 打印子切片从索引 2(包含) 到索引 5(不包含) */
  27. number3 := numbers[2:5]
  28. printSlice(number3)
  29. }
  30. func printSlice(x []int) {
  31. log.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
  32. }

输出

  1. main.go:43: len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]
  2. main.go:18: numbers == [0 1 2 3 4 5 6 7 8]
  3. main.go:21: numbers[1:4] == [1 2 3]
  4. main.go:24: numbers[:3] == [0 1 2]
  5. main.go:27: numbers[4:] == [4 5 6 7 8]
  6. main.go:43: len=0 cap=5 slice=[]
  7. main.go:43: len=2 cap=9 slice=[0 1]
  8. main.go:43: len=3 cap=7 slice=[2 3 4]

append() 和 copy() 函数

  • 如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。
  • 下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。 ```go package main

import ( “io” “log” “os” )

func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile)

  1. var numbers []int
  2. log.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)
  3. /* 允许追加空切片 */
  4. numbers = append(numbers, 0)
  5. log.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)
  6. /* 向切片添加一个元素 */
  7. numbers = append(numbers, 1)
  8. log.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)
  9. /* 同时添加多个元素 */
  10. numbers = append(numbers, 2, 3, 4)
  11. log.Printf("len=%d cap=%d slice=%v\n", len(numbers), cap(numbers), numbers)
  12. /* 创建切片 numbers1 是之前切片的两倍容量*/
  13. numbers1 := make([]int, len(numbers), (cap(numbers))*2)
  14. /* 拷贝 numbers 的内容到 numbers1 */
  15. copy(numbers1, numbers)
  16. log.Printf("len=%d cap=%d slice=%v\n", len(numbers1), cap(numbers1), numbers1)

}

  1. 输出
  2. ```go
  3. main.go:14: len=0 cap=0 slice=[]
  4. main.go:18: len=1 cap=1 slice=[0]
  5. main.go:22: len=2 cap=2 slice=[0 1]
  6. main.go:26: len=5 cap=6 slice=[0 1 2 3 4]
  7. main.go:33: len=5 cap=12 slice=[0 1 2 3 4]