没有什么特别的 , 只不过把 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 元素类型的约束 。
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 包讲解】
推荐阅读
- 上好茶品牌,缇丽莎尔护肤品全套系列用着怎么样
- 苹果|iPhone 14系列价格遭曝光:或全系上涨!约5280元起售
- 八马铁观音哪个系列好,铁观音和福鼎白茶哪个好选择哪个
- 密码应用系列之Kerberos身份认证协议
- 果茶系列取名,果茶的功效和作用
- 红木手镯系列市场分析
- 有哪些精致的洗笔系列
- 骁龙870|天玑8100+骁龙870双神U加持!疑似vivo S15系列入网:5月发布
- 圣恩熙女鞋产品系列简介
- D-Sub接口5大系列的深度解析