背景:
要求寫一個方法,返回去重后的數組。數組的類型可能是int64
,也可能是string
,或是其他類型。
如果區分類型的話,每增加一個新的類型都需要重新寫一個方法。
示例代碼:
//對int64數組進行去重
func DeDuplicateInt64Slice(array []int64) []int64 {mp := make(map[int64]struct{})idx := 0for _, value := range array {if _, ok := mp[value]; ok {continue}array[idx] = valueidx = idx + 1mp[value] = struct{}{}}return array[:idx]
}//對string數組進行去重
func DeDuplicateStringSlice(array []string) []string {mp := make(map[string]struct{})idx := 0for _, value := range array {if _, ok := mp[value]; ok {continue}array[idx] = valueidx = idx + 1mp[value] = struct{}{}}return array[:idx]
}
使用泛型實現后的代碼
//對數組去重
func DeDuplicateSlice[T any](array []T) []T {mp := make(map[any]struct{})idx := 0for _, value := range array {if _, ok := mp[value]; ok {continue}array[idx] = valueidx = idx + 1mp[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{}