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

 更新时间:2024年08月19日 11:26:19   作者:tekin  
go语言中的切片是使用非常频繁的一个数据结构,本文主要介绍了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) //用来去重的临时map
	for _, v := range ss {
		if _, ok := m1[v]; !ok {
			m1[v] = 1
			newSS = 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 := 0
	for key := range m1 { // 循环map, 将key放入到切片中
		newSS[idx] = key
		idx++
	}
	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 := false
		for j := i + 1; j < len(ss); j++ {
			if ss[i] == ss[j] {
				repeat = true
				break
			}
		}
		if !repeat {
			newSS = append(newSS, ss[i])
		}
	}
	return
}

总结

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

到此这篇关于go语言切片去重的3种方式 的文章就介绍到这了,更多相关go语言切片去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Go 语言垃圾回收机制从入门到理解

    Go 语言垃圾回收机制从入门到理解

    本文主要介绍了Go 语言垃圾回收机制从入门到理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • golang使用通道时需要注意的一些问题

    golang使用通道时需要注意的一些问题

    本文主要介绍了golang使用通道时需要注意的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Go语言服务器开发实现最简单HTTP的GET与POST接口

    Go语言服务器开发实现最简单HTTP的GET与POST接口

    这篇文章主要介绍了Go语言服务器开发实现最简单HTTP的GET与POST接口,实例分析了Go语言http包的使用技巧,需要的朋友可以参考下
    2015-02-02
  • Go语言删除文本文件中的指定行操作代码

    Go语言删除文本文件中的指定行操作代码

    假设现在有一个文本文件,我们需要删除文件中乱码的行。我们可以使用go的os库来处理文件,遍历整个文件然后将除过乱码的行写入一个新文件,以此来实现我们的需求,这篇文章主要介绍了Go语言删除文本文件中的指定行,需要的朋友可以参考下
    2023-12-12
  • Go语言执行cmd命令库的方法实现

    Go语言执行cmd命令库的方法实现

    go语言用来执行一个系统的命令相对python来说还是有点复杂的,执行命令是一个非常常见的需求,本文主要介绍了Go语言执行cmd命令库的方法实现,感兴趣的可以了解一下
    2023-09-09
  • golang利用pprof与go-torch如何做性能分析

    golang利用pprof与go-torch如何做性能分析

    这篇文章主要给大家介绍了关于golang利用pprof与go-torch如何做性能分析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Go语言中命令行参数解析工具pflag的使用指南

    Go语言中命令行参数解析工具pflag的使用指南

    在使用 Go 进行开发的过程中,命令行参数解析是我们经常遇到的需求,于是 Go 社区中出现了一个叫 pflag 的第三方包,功能更加全面且足够强大,下面我们就来看看它的具体使用吧
    2024-11-11
  • go zero微服务实战系服务拆分

    go zero微服务实战系服务拆分

    这篇文章主要为大家介绍了go zero微服务实战系服务拆分的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 基于go interface{}==nil 的几种坑及原理分析

    基于go interface{}==nil 的几种坑及原理分析

    这篇文章主要介绍了基于go interface{}==nil 的几种坑及原理分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang使用go mod导入本地包和第三方包的方式

    golang使用go mod导入本地包和第三方包的方式

    这篇文章主要介绍了golang使用go mod导入本地包和第三方包的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论