一、概述
- 数组的长度定义之后,就无法进行修改;数组是一种值类型,每次传递都会产生一个副本,当传递的数组比较大的时候,会影响传递效率。很难满足在实际开发中现实需要,因此go语言为我们提供了一种数组切片(slice)来弥补不足
- 切片并不是数组或者数组的指针,它是通过内部指针和相关的属性引用数组片段,以实现变长方案(扩容)
- slice并不是珍珍意义上动态数组,而是一种引用类。slice总是指向一个底层的array,slice的声明也可以像array一样,只是不需要声明长度
- slice声明:[low:high:max]
low:数组下标的起点 high:数组下标的结束点(不包括此点) [arr[low]:arr[high])
len:长度=high-low cap:容量= max-low
二、切片的长度与容量
package main
import "fmt"
func main() {
arr := [5]int{11, 22, 33, 0, 0}
slice := arr[0:3:5]
fmt.Println("slice=", slice) // 打印切片
fmt.Println("len(slice)=", len(slice)) // 长度 3-0
fmt.Println("cap(slice)=", cap(slice)) // 容量 5-0
fmt.Println("=========================================")
slice = arr[1:4:5]
fmt.Println("slice=", slice) // 打印切片 从下标1开始
fmt.Println("len(slice)=", len(slice)) // 长度 4-1
fmt.Println("cap(slice)=", cap(slice)) // 容量 5-1
}
三、切片的创建
- 数组 []里面的长度是固定的,是不可以修改的,长度len 和容量cap是不可以修改的
- 切片 []里面为空,或者... ,切片的长度和容量可以不固定
package main
import "fmt"
func main() {
// 数组 []里面的长度是固定的,是不可以修改的,长度len 和容量cap是不可以修改的
arr := [5]int{}
fmt.Printf("len=%d, =%d\n", len(arr), cap(arr))
// 切片 []里面为空,或者... ,切片的长度和容量可以不固定
slice := []int{}
fmt.Printf("len=%d, cap=%d\n", len(slice), cap(slice))
// 给切片的末尾追加一个元素
slice = append(slice, 10)
fmt.Printf("append:len=%d, cap=%d\n", len(slice), cap(slice))
}
-
创建方式1:
自动推导,创建的同时进行初始化创建的方式
创建方式2
: 借助make函数 make(切片类型,长度,容量)创建方式
创建方式3 :
没有指定容量,容量和长度一样
package main
import "fmt"
func main() {
// 创建方式1: 自动推导,创建的同时进行初始化
slice1 := []int{11, 22, 33, 44, 55}
fmt.Println("slice1=", slice1)
// 创建的方式2:借助make函数 make(切片类型,长度,容量)
slice2 := make([]int, 4, 6)
fmt.Printf("len=%d, cap=%d\n", len(slice2), cap(slice2))
// 创建方式3:没有指定容量,容量和长度一样
slice3 := make([]int, 5)
fmt.Printf("len=%d, cap=%d\n", len(slice3), cap(slice3))
}