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

相关推荐
久美子37 分钟前
Qoder 使用指南:从配置到落地
后端
tyung39 分钟前
Go 手写 Wait-Free MPSC 无界队列:SwapPointer 实现多生产者无锁入队
后端·go
张不才1 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
鱼人1 小时前
Redis、网关负载均衡为什么不能用普通取模哈希?
后端
juejin9982 小时前
Claude Code Lab-3(下):三能力 MCP Server
后端
java小白小2 小时前
SpringBoot(07):事务管理——@Transactional 你真的用对了吗?
后端
shepherd1112 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
java小白小2 小时前
SpringBoot(05):Spring Data JPA——用面向对象的方式操作数据库
后端
juejin9982 小时前
Claude Code Lab-2(上):自然语言查库助手
后端
java小白小2 小时前
SpringBoot(06):多数据源配置——一个项目连多个库怎么做
后端