我们在go语言开发的时候经常会需要对切片或者数组进行去重操作, 今天就给大家分享一个切片 或者数组去重的通用函数。
这里提醒大家注意go语言是严格区分数据类型的, 切片slice 和 数组 array是不同的数据类型, 不要混淆!!!
切片去重函数,支持数组
对数组去重,在传递参数时需要使用[:]将数组转换为切片, 即 arr[:]
// 切片去重 支持所有切片值为可比较类型的切片进行去重操作
// @author tekintian@gmail.com (QQ: 932256355 )
func SliceUnique[E comparable](ss []E) []E {
list := make([]E, 0)
tmp := make(map[E]byte)
for _, val := range ss {
// v, ok := tmp[val]这个语法是判断tmp中是否有key为val的数据, 如果有 ok返回true, v就是对应的值,否则返回false
if _, ok := tmp[val]; !ok {
tmp[val] = 1 // 将切片的值作为map key放入map中,值随便,这里给个1
list = append(list, val)
}
}
tmp = nil // 手动释放这个临时对象
return list
}
Example测试用例
import "fmt"
// 切片去重Example测试用例
func ExampleSliceUnique() {
// 字符串切片
cases := []string{"a", "b", "c", "d", "a", "b", "c", "e"}
r1 := SliceUnique(cases)
// 数字切片
cs2 := []int{2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8}
r2 := SliceUnique(cs2)
// 定义一个数组
arr1 := [5]int{2, 2, 3, 4, 5}
// 这里注意,SliceUnique函数的参数接收的是切片,所以必须使用[:]将数组转换为切片才行,
// 否则编译报错 类型不匹配 type [5]int of arr1 does not match []E (cannot infer E)
r3 := SliceUnique(arr1[:])
fmt.Printf("r1: %v r2: %v r3: %v \n", r1, r2, r3)
// output: r1: [a b c d e] r2: [2 3 4 5 6 7 8 9 10] r3: [2 3 4 5]
}