0


【Golang】slice切片

slice

Go语言的切片是对数组的抽象。

数组的使用

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // 传递固定长度的数组还是值传递的方式
  6. func printArray(myArray [5]int) {
  7. for index, value := range myArray {
  8. fmt.Println("index:", index, "value:", value)
  9. }
  10. }
  11. func main() {
  12. var myArr [5]int
  13. myArr2 := [10]int{1, 2, 3, 4}
  14. myArr3 := [4]int{1, 2, 3, 4}
  15. myArr4 := []int{1, 2, 3, 4}
  16. for i := 0; i < len(myArr); i++ {
  17. fmt.Println(myArr[i])
  18. }
  19. for index, value := range myArr2 {
  20. fmt.Println("index:", index, "value:", value)
  21. }
  22. fmt.Printf("myArr1 type=%T\n", myArr)
  23. fmt.Printf("myArr2 type=%T\n", myArr2)
  24. fmt.Printf("myArr3 type=%T\n", myArr3)
  25. }

注意

数组传递的参数是以值拷贝的形式进行传递,如下:(在函数中修改了,但在主函数中并没有变化)

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // 传递固定长度的数组还是值传递的方式
  6. func printArray(myArray [5]int) {
  7. for index, value := range myArray {
  8. fmt.Println("index:", index, "value:", value)
  9. }
  10. myArray[0] = 15
  11. }
  12. func main() {
  13. myArr2 := [5]int{1, 2, 3, 4}
  14. printArray(myArr2)
  15. fmt.Println("==================")
  16. for index, value := range myArr2 {
  17. fmt.Println("index:", index, "value:", value)
  18. }
  19. }

Go数组的长度不可改变,在特定的场景中这样的集合就不太适合了,Go中就提供了内置类型切片(动态数组),与数组相比,切片的长度是不固定的,可以追加时可能使得切片的容量增大。

定义切片

可以声明一个未指定大小的数组来定义切片(切片不需要说明长度。)

  1. var identifier []type
使用make()函数来创建切片:
  1. var slice1 []type = make([]type, len)
  2. 也可以简写为
  3. slice1 := make([]type, len)
  4. //也可以指定容量,其中capacity为可选参数。
  5. make([]T, length, capacity)
切片的四种初始化的方式
  1. package main
  2. import "fmt"
  3. func main() {
  4. //声明slice是一个切片,并且初始化,默认值是1,2,3长度是len=3
  5. slice1 := []int{1, 2, 3}
  6. //声明slice是一个切片,但是并没有为slice分配空间
  7. var slice2 []int
  8. slice2 = make([]int, 10, 15)
  9. slice2[0] = 100
  10. //声明slice是一个切片,同时给slice分配3个空间,初始化值是0
  11. var slice3 []int = make([]int, 10)
  12. //声明slice是一个切片,同时为slice分配空间,10个空间,初始化值是0,通过:=推导出slice是一个切片
  13. slice4 := make([]int, 10)
  14. fmt.Printf("len=%d,slice=%v\n", len(slice1), slice1)
  15. fmt.Printf("len=%d,slice=%v,cap=%d\n", len(slice2), slice2, cap(slice2))
  16. fmt.Printf("len=%d,slice=%v\n", len(slice3), slice3)
  17. fmt.Printf("len=%d,slice=%v\n", len(slice4), slice4)
  18. }

切片的追加,截取与拷贝

切片示意图:

追加

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来

长度增加后,超过容量,则容量增加2倍

  1. package main
  2. import "fmt"
  3. func main() {
  4. var numbers = make([]int, 3, 5)
  5. fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
  6. numbers = append(numbers, 1)
  7. fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
  8. numbers = append(numbers, 1)
  9. numbers = append(numbers, 1)
  10. fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
  11. }

截取
  1. s := []int{1, 2, 3}
  2. //左闭右开
  3. s1 := s[0:2]
  4. s1[0] = 100
  5. s[1] = 200
  6. fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s)
  7. fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)

拷贝

截取是采用的浅拷贝,是指向的同一个地址。

如果要深拷贝。可以使用copy函数

  1. s := []int{1, 2, 3}
  2. var s1 = make([]int, 3)
  3. copy(s1, s)
  4. s1[0] = 100
  5. fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s)
  6. fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)


本文转载自: https://blog.csdn.net/m0_62645012/article/details/140290148
版权归原作者 五敷有你 所有, 如有侵权,请联系我们删除。

“【Golang】slice切片”的评论:

还没有评论