思想如下
利用map中key唯一的特性将slice中的数据保存到map的key中。
但是要注意key的类型,有些数值不能做为key。
Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key 类似于索引,指向数据的值。
Map是一种集合,所以可以像迭代数组和切片那样迭代它。不过,Map 是无序的,无法决定它的返回顺序,这是因为Map是使用hash表来实现的。
map中key的类型
golang中的map,其中的 key 可以是很多种类型,比如bool、数字、string、指针、channel,还有只包含前面几个类型的interface types、structs、arrays。
显然,slice,map还有function是不可以了,因为这几个没法用 == 来判断。
// 删除切片中重复的数据 package main import ( "fmt" "reflect" "sort" ) func main() { b := []string{"a", "b", "c", "c", "e", "f", "a", "g", "b", "b", "c"} sort.Strings(b) fmt.Println(Duplicate(b)) c := []int{1, 1, 2, 4, 6, 7, 8, 4, 3, 2, 5, 6, 6, 8} sort.Ints(c) fmt.Println(DeleteDuplicateValue(c)) } func Duplicate(a interface{}) (ret []interface{}) { fmt.Printf("a : %+v\n", a) va := reflect.ValueOf(a) fmt.Printf("va : %+v\n", va) for i := 0; i < va.Len(); i++ { if i > 0 && reflect.DeepEqual(va.Index(i-1).Interface(), va.Index(i).Interface()) { continue } ret = append(ret, va.Index(i).Interface()) } return ret } // 这种方式比较容易理解 func DeleteDuplicateValue(s []int) (ret []int) { fmt.Printf("s :%+v\n", s) tmpM := make(map[int]int) // key的类型要和切片中的数据类型一致 for _, v := range s { tmpM[v] = 1 } // 先清空s s = []int{} for i, _ := range tmpM { s = append(s, i) } return s }