切片(Slice)是一个拥有相同类型元素可变长度的序列,它是基于数组类型的一层封装,支持自动扩容

1.切片的声明

var arr1=[]int{1,2,3,4}
fmt.Printf("%v  %T  长度:%v",arr1,arr1,len(arr1))  // [1 2 3 4] []int 长度:4

var arr2=[]int{1:5,2:10,3:15,5:20}
fmt.Printf("%v  %T  长度:%v",arr2,arr2,len(arr2))  // [0 5 10 15 0 20] []int 长度:6

如果切片只声明,没有给值,默认是nil

2.切片的循环遍历

var strSlice = []{"张三","李四","王五"}
for k, v := range strSlice{
fmt.Println(K,v)} // 0 张三 1 李四 2 王五

3.基于数组定义切片

a := [5]int{1,2,3,4,5}
b := a[:] //获取数组里面的所有值,
//如果想要获取数组中的某一部分值,可以这样定义 c := a[1:3] -> 表示获取数组里1-2位置的值,(左包右不包) 
fmt.Printf("%v -- %T",b,b) // [1 2 3 4 5] -- []int

4.基于切片的切片 (与基于数组的切片类似)

a := []string{"张三","李四","王五"} 
b := a[1:] //获取数组中1位置后所有值,
fmt.Printf("%v -- %T",b,b) // [李四 王五] -- []string

5.切片的长度和容量
len()获取切片长度,长度即元素个数
cap()获取切片容量,从第一个元素开始数到底层数组末尾元素的个数

a := []int{10,20,30,40,50}
fmt.Printf("长度:%d - 容量:%d",len(a),cap(a)) // 长度:5 - 容量:5
b := a[1:3] // 输出值应为:[20 30]
fmt.Printf("长度:%d - 容量:%d",len(b),cap(b)) // 长度:2 - 容量:4(容量是从a[1]到切片末尾元素)

6.make 函数构造切片
make([]T,size,cap)
其中:T:元素类型 size:切片中元素数量 cap:切片的容量
(修改切片/数组的值可直接通过数组下标实现,但是没法通过下标方式给切片扩容)

7.append方法可以给切片动态添加元素,可以合并切片

//动态添加元素
var SliceA []int
SliceA := append(SliceA,10) //动态扩容,可以一次添加多个数据,
fmt.Printf("%v - 长度%d - 容量%d",SliceA,len(SliceA),cap(SliceA)) // [10] - 长度10 - 容量10
//合并切片
SliceA := []string{"张三","李四","王五"}
SliceB := []string{"赵六","小花"}
SliceA = append(SliceA,SliceB...) // 将SliceB合并进SliceA
fmt.Printf(SliceA) // [张三 李四 王五 赵六 小花] 

8.copy() 函数复制切片

值类型:改变变量副本值得时候,不会改变变量本身的值
引用类型:改变变量副本值得时候,会改变变量本身的值,切片就是引用类型

SliceA := []int{10,20,30,40}
SliceB := SliceA
SliceB[0] = 50
fmt.Printf(SliceA) //[50 20 30 40],切片属于引用类型,也会改变SliceA的值
fmt.Printf(SliceB) //[50 20 30 40]

copy()改变副本 不会影响切片本身

SliceA := []int{10,20,30,40}
SliceB := make([]int,4,4)
copy(SliceB,SliceA) // dst: src:, 把A复制到B中
SliceB[0] = 60
fmt.Printf(SliceA) //[10 20 30 40]改变副本 不会影响切片本身
fmt.Printf(SliceB) //[60 20 30 40]