思想如下

利用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
}