Golang 删除切片指定元素
2023-04-18 15:34:22 时间
文章目录
- 参考文献 删除切片指定元素,Go 标准库并未给出相应的函数,需要我们自己实现。以 []int 类型的切片为例,我们可能会直接写出下面的函数。
// DeleteSliceElms 删除切片指定元素(不许改原切片)
func DeleteSliceElms(sl []int, elms ...int) []int {
if len(sl) == 0 || len(elms) == 0 {
return sl
}
// 先将元素转为 set
m := make(map[int]struct{})
for _, v := range elms {
m[v] = struct{}{}
}
// 过滤掉指定元素
res := make([]int, 0, len(sl))
for _, v := range sl {
if _, ok := m[v]; !ok {
res = append(res, v)
}
}
return res
}
// 使用示例
sl := []int{1, 2, 3, 3, 2, 5}
res := DeleteSliceElms(sl, 2, 3) // [1,5]
完全没有问题,上面的函数完美了实现了我们想要的功能。
但是如果我们现在又需要对 []string 类型的切片删除指定的元素,你可能想到的是拷贝一下上面的函数,改下对应的类型即可。
// DeleteStrSliceElms 删除切片指定元素(不许改原切片)
func DeleteStrSliceElms(sl []string, elms ...string) []string {
if len(sl) == 0 || len(elms) == 0 {
return sl
}
// 先将元素转为 set
m := make(map[string]struct{})
for _, v := range elms {
m[v] = struct{}{}
}
// 过滤掉指定元素
res := make([]string, 0, len(sl))
for _, v := range sl {
if _, ok := m[v]; !ok {
res = append(res, v)
}
}
return res
}
如此又解决了我们的问题。但是如果我们又需要对其他类型的切片进行删除,难道故技重施,再次拷贝重复的代码吗?
面对重复的代码,我们应该消灭它,而不是助长它。如何消灭呢,这本该是泛型要做的事情,可惜在 Go(截止 Go 1.17)不支持范型。但是 Go 为我们提供了反射,我们可以利用反射,间接地实现范型的效果:只写一个函数,支持所有类型的切片。
相关文章
- python2.7 中 print()函数的使用及input()、与raw_input()的区别
- C++11库中 steady_clock , system_clock和high_resolution_clock的区别
- NIO基础-多线程-线程池-selector的区别
- Android MVVM架构
- 解决 Android APP 启动页白屏问题及如何实现全屏显示
- Python Tkinter 创建窗口及有关事件1
- UVCAndroid,安卓UVC相机通用开发库(支持多预览和多摄像头)
- 【3.14】Redis过期删除、内存淘汰、主从复制,操作系统文件系统,设备管理
- C语言实现windows,linux双版本下的进度条小程序,快来试一试吧
- 整理的2022年基于php毕业设计成品题目项目作品课题源码
- 大数据框架之Hive:第10章 分区表和分桶表
- Mac 安装 pip 看这里就够了,pip、pip2、pip3 再也不懵了
- Pytorch机器学习(八)—— YOLOV5中NMS非极大值抑制与DIOU-NMS等改进
- 图像质量评价指标metrics:PSNR 、SSIM、LPIPS
- Linux常用命令——基于Ubuntu22.04
- SE注意力机制
- MAC地址简介
- 关于 ChatGPT 必看的 10 篇论文
- 【代码训练营】day59 | 503.下一个更大元素II & 42. 接雨水
- 超图神经网络(HGNN)