go语言切片去重的3种方式总结

go语言中的切片是使用非常频繁的一个数据结构,对于他的去重,我们可以有以下3种方式

1. 切片slice去重 利用map的key不能重复的特性+append函数  一次for循环搞定

这个模式时间复杂度最低,效率最高, 如果go版本大于1.21推荐使用这种方式的泛型参数版本


// 改进版的slice去重
func UniqueSliceInt64(ss []int64) []int64 {newSS := make([]int64, 0)  // 返回的新切片m1 := make(map[int64]byte) //用来去重的临时mapfor _, v := range ss {if _, ok := m1[v]; !ok {m1[v] = 1newSS = append(newSS, v)}}return newSS
}

泛型参数版本,需要go版本大于1.21 否则不能使用泛型参数


// 切片去重升级版 泛型参数 利用map的key不能重复的特性+append函数  一次for循环搞定
func Unique[T cmp.Ordered](ss []T) []T {size := len(ss)if size == 0 {return []T{}}newSlices := make([]T, 0) //这里新建一个切片,大于为0, 因为我们不知道有几个非重复数据,后面都使用append来动态增加并扩容m1 := make(map[T]byte)for _, v := range ss {if _, ok := m1[v]; !ok { //如果数据不在map中,放入m1[v] = 1                        // 保存到map中,用于下次判断newSlices = append(newSlices, v) // 将数据放入新的切片中}}return newSlices
}

2. 切片去重  利用map的key不能重复的特性 2次for循环

下面这个使用了泛型参数

//go版本大于1.21的情况,可以使用泛型参数// 切片去重  泛型参数 利用map的key不能重复的特性 2次for循环
func Unique1[T cmp.Ordered](ss []T) []T {size := len(ss)if size == 0 {return []T{}}// 这个地方利用了map数据的key不能重复的特性,将切片的值当做key放入map中,达到去重的目的m1 := make(map[T]byte)for i := 0; i < size; i++ {m1[ss[i]] = 1}// 创建一个切片,长度为去重后的数据长度newSS := make([]T, len(m1))idx := 0for key := range m1 { // 循环map, 将key放入到切片中newSS[idx] = keyidx++}return newSS
}

cmp.Ordered泛型参数约束接口参考
    注意上面的泛型参数约束 cmp.Ordered 是一个专门用于泛型类型约束的接口定义, 需要go版本大于1.21才能使用

type Ordered interface {~int | ~int8 | ~int16 | ~int32 | ~int64 |~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |~float32 | ~float64 |~string
}

3. 切片去重 双层for循环模式

这种方式方式直观,但是时间复杂度较高!

// 切片去重 双层for循环模式
func Unique0(ss []int64) (newSS []int64) {newSS = make([]int64, 0)for i := 0; i < len(ss); i++ {repeat := falsefor j := i + 1; j < len(ss); j++ {if ss[i] == ss[j] {repeat = truebreak}}if !repeat {newSS = append(newSS, ss[i])}}return
}

总结

 对于golang的切片去重,效率最高的方式为map+append函数的方式,因为他们的时间复杂度是最低的,对于go版本大于1.21的推荐使用泛型参数的切片去重,这样一个函数就可以解决所有类型的切片去重问题,高效精简! 

怎么样,你觉得那种方式更好呢? 或者说你有更好的去重方式? 欢迎盘龙区留言讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PlugLink与RPA的完美结合:打造智能自动化工作流(附源码)

PlugLink与RPA的完美结合&#xff1a;打造智能自动化工作流 自动化技术已经成为提高效率和减少错误的关键手段。两种主要的自动化技术——PlugLink和RPA&#xff08;机器人流程自动化&#xff09;——各有特色。本文将详细探讨PlugLink与RPA的不同之处&#xff0c;并介绍它们如…

软件测试需求管理指南规范(Word原件,项目管理全资料)

3 测试需求 3.1 测试范围 3.2 测试目标 4 测试需求的现状 5 测试需求的内容 5.1 主体内容 5.2 管理内容 6 测试需求的制定 6.1 需求信息来源 6.2 需求分析 6.2.1 功能性需求 6.2.2 系统功能需求 6.2.3 界面需求 6.2.4 安装需求 6.2.5 业务需求 6.2.6 非功能性需求 6.2.7 性能需…

ai怎么导出jpg?让我告诉你答案【详】

在设计和创意工作中&#xff0c;Adobe Illustrator&#xff08;AI&#xff09;是一款不可或缺的工具。然而&#xff0c;当我们将设计作品导出为JPG格式时&#xff0c;可能会遇到一些问题。ai怎么导出jpg&#xff1f;如何确保导出的JPG图片保持高质量&#xff1f;接下来&#xf…

异步通知驱动实例

目录 异步通知驱动功能的优点 异步通知测试程序: 异步驱动程序 异步通知驱动功能的优点 提高性能:通过允许应用程序在等待操作完成时执行其他任务,可以提高应用程序的整体性能。改善用户体验:应用程序可以保持响应性,用户界面可以流畅地更新,提供更好的用户体验。资源…

【Js】深入浅出的js for循环 for loop以及闭坑指南

在JavaScript中使用forEach循环来删除数组中的特定元素可能会导致一些问题&#xff0c;因为forEach不允许你在迭代过程中修改数组的长度。 这会导致意外的行为&#xff0c;例如跳过元素或错误地索引。因此&#xff0c;建议使用其他方法来安全地删除数组中的元素。 存在的问题 1…

php质量工具系列之phpmd

PHPMD PHP Mess Detector 它是PHP Depend的一个衍生项目&#xff0c;用于测量的原始指标。 PHPMD所做的是&#xff0c;扫描项目中可能出现的问题如&#xff1a; 可能的bug次优码过于复杂的表达式未使用的参数、方法、属性 PHPMD是一个成熟的项目&#xff0c;它提供了一组不同的…

HarmonyOS NEXT Push接入

接入HarmonyOS NEXT Push 推送功能,相比于 Android 真的是简单太多。不再需要适配接入各个厂家的推送 SDK,真是舒服。 1.开通推送服务与配置Client ID 1.1 创建应用获取Client ID 按照官方文档来就可以了:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides…

常用的接口测试工具

大家好&#xff0c;当谈到软件开发中的质量保证时&#xff0c;接口测试无疑是至关重要的一环。在当今快节奏的开发环境中&#xff0c;确保应用程序的各个组件之间的交互正常运作是至关重要的。而接口测试工具则成为了开发人员和测试人员的得力助手&#xff0c;帮助他们有效地测…

关于抽样检验的案例来说明95%置信区间

抽样检验是统计学中常用的一种方法&#xff0c;通过分析样本数据来推断总体特征。95%置信区间在抽样检验中扮演着重要角色&#xff0c;因为它提供了对总体参数估计的可靠性区间。下面是一个具体的案例来说明如何使用95%置信区间进行抽样检验。 案例背景 假设一家制药公司正在…

LLM推理加速原理(一)

1.大语言模型的基本结构 transfomer block: 输入--->正则化-->qkv三个矩阵层(映射到三个不同空间中)---->q,k,v之后self attention进行三0合一---->线性映射,正则化。 2.大语言模型的推理 目前主流的语言大模型都采用decoder-only的结构,其推理过程由两部分…

YOLOv3训练自己的数据集

简要笔记 一、数据标注 1.安装好labelme工具 2.标注自己的数据&#xff0c;拿到json文件 二、编辑训练代码所需要的配置文件 config文件夹&#xff0c;create_custom_model.sh &#xff08;参数&#xff1a;类别个数&#xff09; 自动生成网络cfg文件 三、标签格式转换 1.la…

基于R语言的糖尿病检测模型准确率97%

使用R语言构建糖尿病检测模型的示例。我们将使用常见的机器学习算法(如逻辑回归)来构建模型,并使用Pima Indians Diabetes数据集进行训练和评估。 1. 安装和加载必要的包 首先,我们需要安装并加载必要的R包。我们将使用caret包来进行数据预处理、模型训练和评估。 # 安装…

辞职后,如何理性面对公司的挽留?我的职场选择之路

辞职后&#xff0c;面对公司的挽留&#xff0c;你会决定留下还是离开呢&#xff1f;这是一个让人犹豫不决的问题。 让我们来分析一下个人在职场中的价值和期望。每个人都有自己的职业规划和发展目标&#xff0c;这是非常正常的。在工作中&#xff0c;我们希望自己能够得到充分的…

常规操作-ArcGIS常用标注技巧

常规操作-ArcGIS常用标注技巧 1、简单的"&“符号&#xff1a;多字段表达只需要用”&"符号&#xff0c;多个字段之间需要空格&#xff0c;空格符号需要加双引号。 表达式为&#xff1a; [字段] & " " & [字段] 2、“VBnewline"应用…

vue 将echart 下载为base64图片

1 echart是页面的子组件&#xff0c; 2 页面有多个echart 3 将多个echart下载为base64图片 // 子组件 echart&#xff0c;要保存echartconst chart this.$echarts.init(this.$refs.chart, light) this.chartData chart; //保存数据&#xff0c;供父组件alarmReport调用(th…

Web前端开发基础笔记(6)

Web前端开发基础笔记&#xff08;6&#xff09; 一、Html基础 html的介绍 html的定义 HTML的全称为&#xff1a;HyperText Mark-up-Language,指的是超文本标记语言。标记&#xff1a;就是标签&#xff0c;<标签名称> </标签名称>&#xff0c;比如<html>&…

Introduction to HAL3

目录 HAL3 behavior Overview of HAL1 v.s HAL3 HAL3 behavior: HAL3 - detail: HAL3 operation and pipeline Framework Diagram Problem of current code Operation mode Full v.s limited Do: Don’t: Metadata Manual control – ISP control

【CTF MISC】XCTF GFSJ0155 simple_transfer Writeup(流量分析+文件提取)

simple_transfer 文件里有flag&#xff0c;找到它。 解法 用 wireshark 分析&#xff0c;大部分都是 TCP 协议。 打开协议分级统计&#xff0c;有个 DLEP 占了 94.2% 的数据。 作为过滤器使用。全都是 Unknown。 用 binwalk 扫描。 binwalk f9809647382a42e5bfb64d7d447b409…

集合的介绍

集合指的是数据集中在一块。集合的好处体现在以下几点 1.可以动态保存任意多个对象&#xff0c;使用比较方便。 2.提供了一系列方便的操作对象的方法&#xff1a;add,remove,set,get等&#xff0c;方便增加&#xff0c;删除内容。 集合Collection单列集合一览图 集合Map双列集…

天智云智造管理平台 Usermanager.ashx SQL注入漏洞复现

0x01 产品简介 天智云智造管理平台又称天智云SAAS平台,是专业为中小型生产企业提供智能化生产管理的标准MES软件。 该系统向中小型生产企业提供一站式平台服务,串联销售/采购/生产/质量/仓库等各个部门。对内可以节约成本,规范生产过程,实现质量追溯,实时跟踪生产及库存数…