【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{}

相关推荐
2501_946244781 分钟前
Flutter & OpenHarmony OA系统设置页面组件开发指南
开发语言·javascript·flutter
一分半心动4 分钟前
清理C盘的python脚本
开发语言·python
爱上妖精的尾巴13 分钟前
7-3 WPS JS宏 keys、values、entries、JSON.stringify 循环对象中的属性
后端·restful·wps·jsa
一只鹿鹿鹿32 分钟前
网络信息与数据安全建设方案
大数据·运维·开发语言·网络·mysql
a努力。34 分钟前
国家电网Java面试被问:慢查询的优化方案
java·开发语言·面试
@小码农1 小时前
202512 电子学会 Scratch图形化编程等级考试四级真题(附答案)
java·开发语言·算法
ejjdhdjdjdjdjjsl1 小时前
C#类型转换与异常处理全解析
开发语言·c#
qq_336313931 小时前
java基础-IO流(转换流)
java·开发语言·python
小宇的天下1 小时前
Calibre nmDRC 运行机制与规则文件(13-2)
运维·开发语言
扶苏-su1 小时前
Java---IO流原理和分类
java·开发语言