Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,容量(cap)不够时会自动扩容

切片为引用类型,从数组中得到的切片修改元素值时,原数组也会发生变化,修改原数组时,切片也会变化

创建切片的四种方法

  1. var
1
var s []uint32

2.切片字面量,这样创建的切片长度和容量都等于初始元素个数

1
s := []uint32{1, 2, 3}

3.make
使用make创建,可以指定长度和容量。格式为make([]type, len[, cap]),可以只指定长度,也可以长度容量同时指定

1
2
3
s1 := make([]uint32)
s2 := make([]uint32, 1)
s3 := make([]uint32, 1, 10)

4,截取符,可以从现成的数组或切片创建

1
2
3
4
5
var arr [10]uint32
s1 := arr[0:5]
s2 := arr[:5]
s3 := arr[5:]
s4 := arr[:]

二、添加元素

使用append()函数向切片中添加元素,可以一次添加 0 个或多个元素,如果容量不够会自动扩容

1
2
3
4
5
6
7
s := make([]uint32, 0, 4)

s = append(s, 1, 2, 3)
fmt.Println(len(s), cap(s)) // 3 4

s = append(s, 4, 5, 6)
fmt.Println(len(s), cap(s)) // 6 8

使用copy()将内容从一个数组切片复制到另一个数组切片。如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制

1
2
3
4
5
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}

copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置

三、删除元素

截取需要的那部分再赋值回去就是删除

PS:关于扩容的一个小问题
话说往切片增加元素时容量不够会自动扩容,那每次到底扩了多少呢?
还是有点复杂的,详情可以看这里