当前位置: 首页 > article >正文

【Golang】使用泛型对数组进行去重

背景:
要求写一个方法,返回去重后的数组。数组的类型可能是int64,也可能是string,或是其他类型。
如果区分类型的话,每增加一个新的类型都需要重新写一个方法。
示例代码:

//对int64数组进行去重
func DeDuplicateInt64Slice(array []int64) []int64 {
	mp := make(map[int64]struct{})
	idx := 0
	for _, value := range array {
		if _, ok := mp[value]; ok {
			continue
		}
		array[idx] = value
		idx = idx + 1
		mp[value] = struct{}{}
	}
	return array[:idx]
}

//对string数组进行去重
func DeDuplicateStringSlice(array []string) []string {
	mp := make(map[string]struct{})
	idx := 0
	for _, value := range array {
		if _, ok := mp[value]; ok {
			continue
		}
		array[idx] = value
		idx = idx + 1
		mp[value] = struct{}{}
	}
	return array[:idx]
}

使用泛型实现后的代码

//对数组去重
func DeDuplicateSlice[T any](array []T) []T {
	mp := make(map[any]struct{})
	idx := 0
	for _, value := range array {
		if _, ok := mp[value]; ok {
			continue
		}
		array[idx] = value
		idx = idx + 1
		mp[value] = struct{}{}
	}
	return array[:idx]
}

其中:
T 是类型参数,在函数体里的用法跟其他数据类型(如int一样)
any 是类型约束,这里的any可以是任何类型,也就是没有约束

// any is an alias for interface{} and is equivalent to interface{} in all ways.
type any = interface{}


http://www.kler.cn/a/147508.html

相关文章:

  • React Hooks 深度解析与实战
  • springboot实现简单的数据查询接口(无实体类)
  • RabbitMQ实战启程:从原理到部署的全方位探索(上)
  • SQL Server Service Broker完整示例
  • 11.08-10.14谷粒商城
  • SASS 控制指令详解@for、@if、@each、@while
  • Linux多路转接select,poll
  • 应用密码学期末复习(1)
  • A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 如何去掉
  • 【Java Spring】SpringBoot 日志系统
  • uni-app中的onLoad不执行
  • 第二十章,多线程
  • Docker:深入解析Nexus技术构建可靠的软件仓库管理系统
  • centos用什么命令可查看版本号
  • Android保活系列之——进程优先级
  • python-爬虫(可直接使用)
  • Element-Plus 图标自动导入
  • 【密码学】【多方安全计算】不经意传输(Oblivious Transfer,OT)
  • JS作用域与作用域链
  • 2.3基于springboot养老院管理系统
  • 【Android知识笔记】性能优化专题(四)
  • springboot+vue实现websocket通信实例,进入页面建立连接
  • 浏览器触发下载Excel文件-Java实现
  • 一些可能被忽视的 Vue3 API 附带案例
  • 5G智慧工地整体解决方案:文件全文115页,附下载
  • Kubernetes之kubeadm日志展示篇—fiendweb日志展示平台部署