Go標準庫自己沒有提供一個去除slice中重複元素的函數,須要本身去實現。下面提供一種實現思路,若是有更好的實現方法歡迎留言討論。php
package main import ( "fmt" ) func main() { s := []string{"hello", "world", "hello", "golang", "hello", "ruby", "php", "java"} fmt.Println(removeDuplicateElement(s)) //output: hello world golang ruby php java } func removeDuplicateElement(languages []string) []string { result := make([]string, 0, len(languages)) temp := map[string]struct{}{} for _, item := range languages { if _, ok := temp[item]; !ok { temp[item] = struct{}{} result = append(result, item) } } return result }
removeDuplicateElement
函數總共初始化兩個變量,一個長度爲0的slice
,一個空map
。因爲slice
傳參是按引用傳遞,沒有建立佔用額外的內存空間。map[string]struct{}{}
建立了一個key類型爲String值類型爲空struct
的map
,等效於使用make(map[string]struct{})
struct
不佔內存空間,使用它來實現咱們的函數空間複雜度是最低的。Playground URL
Reference URLjava
上面的去除重複元素的函數,只能處理字符串切片對於其餘類型的切片就不行了。若是不想針對每種類型的切片都寫一個去重函數的話能夠使用Go的type-switch本身寫一個能夠處理多個切片類型的函數。下面是我寫的一個實現:git
package common import ( "fmt" ) type sliceError struct { msg string } func (e *sliceError) Error() string { return e.msg } func Errorf(format string, args ...interface{}) error { msg := fmt.Sprintf(format, args...) return &sliceError{msg} } func removeDuplicateElement1(originals interface{}) (interface{}, error) { temp := map[string]struct{}{} switch slice := originals.(type) { case []string: result := make([]string, 0, len(originals.([]string))) for _, item := range slice { key := fmt.Sprint(item) if _, ok := temp[key]; !ok { temp[key] = struct{}{} result = append(result, item) } } return result, nil case []int64: result := make([]int64, 0, len(originals.([]int64))) for _, item := range slice { key := fmt.Sprint(item) if _, ok := temp[key]; !ok { temp[key] = struct{}{} result = append(result, item) } } return result, nil default: err := Errorf("Unknown type: %T", slice) return nil, err } }
struct
的map
。key的值是切片元素的字符串表現形式(類型的String()
方法的返回值)原文連接github