go语言基础5(切片3)|青训营笔记

95 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第7天。

7)切片

copy():切片复制(切片拷贝)

Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。

copy() 函数的使用格式如下:

其中 srcSlice 为数据来源切片

destSlice 为复制的目标(也就是将 srcSlice 复制到 destSlice)

目标切片必须分配过空间且足够承载复制的元素个数,并且来源和目标的类型必须一致

copy() 函数的返回值表示实际发生复制的元素个数。

copy( destSlice, srcSlice []T) int

代码展示了使用 copy() 函数将一个切片复制到另一个切片的过程:

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个位置

Go语言从切片中删除元素

Go语言并没有对删除切片元素提供专用的语法或者接口,需要使用切片本身的特性来删除元素,根据要删除元素的位置有三种情况,分别是从开头位置删除、从中间位置删除和从尾部删除,其中删除切片尾部的元素速度最快。

从开头位置删除

  • 第一种:
a = []int{1, 2, 3}
a = a[1:] // 删除开头1个元素
a = a[N:] // 删除开头N个元素
  • 第二种:
a = []int{1, 2, 3}
a = append(a[:0], a[1:]...) // 删除开头1个元素 
a = append(a[:0], a[N:]...) // 删除开头N个元素
  • 第三种:使用copy()
a = []int{1, 2, 3} 
a = a[:copy(a, a[1:])] // 删除开头1个元素 
a = a[:copy(a, a[N:])] // 删除开头N个元素

从中间位置删除

对于删除中间的元素,需要对剩余的元素进行一次整体挪动,同样可以用 append 或 copy 原地完成:

a = []int{1, 2, 3, ...}
a = append(a[:i], a[i+1:]...) // 删除中间1个元素
a = append(a[:i], a[i+N:]...) // 删除中间N个元素
a = a[:i+copy(a[i:], a[i+1:])] // 删除中间1个元素
a = a[:i+copy(a[i:], a[i+N:])] // 删除中间N个元素

从尾部删除

a = []int{1, 2, 3}
a = a[:len(a)-1] // 删除尾部1个元素
a = a[:len(a)-N] // 删除尾部N个元素