耐心和持久胜过激烈和狂热。

哈喽大家好,我是陈明勇,今天分享的内容是巧用 Go Map 特性对数组或切片进行去重。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

前言
JavaSetSetGoSetGoMapSetMapkeyMap
使用 Map 构建 Set
type MySet map[any]struct{}
MySetmap[any]strcut{}
mapkeyanymapkeymapvaluestruct{}k-vvaluestrcut{}{}fmt.Println(unsafe.Sizeof(struct{}{})) // 0
对数组或切片去重
import "fmt"

type MySet map[any]struct{}

func main() {
	s1 := []int{1, 1, 2, 3}
	fmt.Println(duplicateRemoving(s1)) // [1 2 3]
	s2 := []string{"a", "b", "c", "a"}
	fmt.Println(duplicateRemoving(s2)) // [a b c]
}

func duplicateRemoving[T any](s []T) []T {
	res := make([]T, 0, len(s))
	mySet := make(MySet)
	for _, t := range s {
		if _, ok := mySet[t]; !ok {
			res = append(res, t)
			mySet[t] = struct{}{}
		}
	}
	return res
}

核心思路

resMySet mySetsmySetstkeyrestmySett → struct{}{}
小结
GoMapMapSetValuestruct{}Valuestrcut{}{}