Open kevinyan815 opened 5 years ago
func distinct[T comparable](input []T) []T {
set := make(map[T]struct{})
res := make([]T, 0, len(set))
for _, value := range input {
if _, ok := set[value]; !ok {
set[value] = struct{}{}
res = append(res, value)
}
}
return res
}
提供一个泛型实现
Slice去除重复元素
golang标准库本身没有提供一个去除slice中重复元素的函数,需要自己去实现。 代码示例
解释
removeDuplicateElement
函数总共初始化两个变量,一个长度为0的slice
,一个空map
。由于slice
传参是按引用传递,没有创建占用额外的内存空间。map[string]struct{}{}
创建了一个key类型为String值类型为空struct
的map
,等效于使用make(map[string]struct{})
struct
不占内存空间,使用它来实现我们的函数空间复杂度是最低的。Playground URL Reference URL
适配多个切片类型
上面的去除重复元素的函数,只能处理字符串切片对于其他类型的切片就不行了。如果不想针对每种类型的切片都写一个去重函数的话可以使用Go的type-switch自己写一个可以处理多个切片类型的处理函数。下面是我写的一个实现:
函数接收一个空接口类型的参数,然后使用类型选择进入相应的分支进行处理。这里可以根据需求实现函数需支持的切片类型的处理程序。
每个分支里同样创建了一个key类型为string值类型为空
struct
的map
。key的值是切片元素的字符串表现形式(类型的String()
方法的返回值)函数返回值的类型是空接口,所以拿到返回值后要进行类型断言才能使用。