Go泛型系列:slices 包讲解( 二 )

没有什么特别的 , 只不过把 s1、s2 当成同类型的 slice 进行操作而已 。
元素查找在 slice 中查找某个元素 , 分为普通的所有查找和包含判断:
func Index[E comparable](s []E, v E) intfunc IndexFunc[E any](s []E, f func(E) bool) intfunc Contains[E comparable](s []E, v E) bool其中 , IndexFunc 的类型参数没有使用任何约束(即用的 any) , 说明查找是通过 f 参数进行的 , 它的实现如下:
func IndexFunc[E any](s []E, f func(E) bool) int { for i, v := range s {if f(v) {return i} } return -1}参数 f 是一个函数 , 它接收一个参数 , 类型是 E , 是一个泛型 , 和 IndexFunc 的第一个参数类型 []E 的元素类型保持一致即可 , 因此可以直接将遍历 s 的元素传递给 f 。
修改 slice一般不建议做相关操作 , 因为性能较差 。如果有较多这样的需求 , 可能需要考虑更换数据结构 。
// 往 slice 的位置 i 处插入元素(可以多个)func Insert[S ~[]E, E any](s S, i int, v ...E) S// 删除 slice 中 i 到 j 的元素 , 即删除 s[i:j] 元素func Delete[S ~[]E, E any](s S, i, j int) S// 将连续相等的元素替换为一个 , 类似于 Unix 的 uniq 命令 。Compact 修改切片的内容 , 它不会创建新切片func Compact[S ~[]E, E comparable](s S) func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S// 增加 slice 的容量 , 至少增加 n 个func Grow[S ~[]E, E any](s S, n int) S// 移除没有使用的容量 , 相当于缩容func Clip[S ~[]E, E any](s S) S以上类型约束都包含了两个:

  • S ~[]E:表明这是一个泛型版 slice , 这是对 slice 的约束 。注意 [] 前面的 ~ , 表明支持自定义 slice 类型 , 如 type myslice []int
  • E any 或 E comparable:对上面 slice 元素类型的约束 。
克隆 slice即获得 slice 的副本 , 会进行元素拷贝 , 注意 , slice 中元素的拷贝是浅拷贝 , 非值类型不会深拷贝 。
func Clone[S ~[]E, E any](s S) S { // Preserve nil in case it matters. if s == nil {return nil } return Append(S([]E{}), s...)}04 总结因为泛型的存在 , 同样的功能 , 对不同类型的 slice 再也不用写多份代码 。因为一些功能很常见 , 因此 Go 官方将其封装 , 将来会在标准库中提供 。
出于谨慎考虑 , slices 包不会在 1.18 中包含 , 如果你需要用到 slices 中的功能 , 可以采用从 slices 代码中复制的方式 , 个人觉得依赖 golang.org/x/exp 还是不太好 。
slices 源码地址:https://github.com/golang/exp/blob/master/slices/slices.go 。

【Go泛型系列:slices 包讲解】


推荐阅读