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

背景:

要求写一个方法,返回去重后的数组。数组的类型可能是int64,也可能是string,或是其他类型。

如果区分类型的话,每增加一个新的类型都需要重新写一个方法。
示例代码:

go 复制代码
//对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]
}

使用泛型实现后的代码

go 复制代码
//对数组去重
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{}

相关推荐
叫我:松哥14 分钟前
基于flask图书管理系统,技术栈flask+layui+sqlite+Echarts
后端·python·数据分析·flask·echarts·layui
落魄大学生之流水线上谋生计14 分钟前
Python Literal[] 类型提示详解
开发语言·python
圣殿骑士-Khtangc15 分钟前
Go-defer机制深度解析执行顺序与性能优化实战
golang
铁皮饭盒15 分钟前
网页端, 5.5mb谷歌模型, 识别躯干, 视频都不卡
前端·javascript·后端
WongKyunban19 分钟前
Go语言的简洁并发编程
开发语言·后端·golang
重生之后端学习28 分钟前
438. 找到字符串中所有字母异位词[中等]✅
开发语言·数据结构·算法·leetcode·职场和发展
晴天1631 分钟前
Gradio 与 Streamlit:Python 快速构建 Web 应用的双子星-Day28
开发语言·前端·python
nxb55633 分钟前
云原生:控制器
java·开发语言·云原生
mldong37 分钟前
一条命令,十分钟:jeeflow 工作流应用的六语言一键部署
前端·后端·架构
Shawn_Shawn42 分钟前
本体论的基本核心概念
后端·llm·领域驱动设计