Golang中没有直接提供set的实现,但是可以利用已有的map来实现一个简单的set

package main

import (
	"fmt"
)

//定义1个set结构体 内部主要是使用了map
type set struct {
	elements map[interface{}]bool
}

//interface{}表示任意类型
//...表示任意参数个数
//初始化一个set 并加入给定的参数
func New(items ...interface{}) Set {
	st := set{
		elements: make(map[interface{}]bool),
	}
	for _, item := range items {
		st.Add(item)
	}
	return &st
}

//定义一个Set接口
type Set interface {
	Add(item interface{})     //添加一个元素
	Delete(item interface{})  //删除给定元素
	Len() int                 //返回set大小
	GetItems() []interface{}  //返回set中的元素
	In(item interface{}) bool //判断元素item是否在set中

}

//注意:下面是set指针类型实现了Set接口  而不是set

func (st *set) Add(item interface{}) {
	st.elements[item] = true
}

func (st *set) Delete(item interface{}) {
	delete(st.elements, item) //调用的是map的删除方法
}
func (st *set) Len() int {
	return len(st.elements)
}
func (st *set) GetItems() []interface{} {
	keys := make([]interface{}, 0, len(st.elements)) //创建一个初始大小为0 容量为sz的切片
	for key, _ := range st.elements {
		keys = append(keys, key)
	}
	return keys //返回切片
}
func (st *set) In(item interface{}) bool {
	if _, in := st.elements[item]; in { //使用了map中的判断一个元素是否存在的方法 in为true则存在
		return true
	}
	return false
}
func main() {
	mySet := New(1, 2, 3)
	fmt.Println(mySet.GetItems())
	mySet.Add(4)
	mySet.Add(3)
	fmt.Println(mySet.GetItems())
	fmt.Println(mySet.In(2))
	fmt.Println(mySet.In(5))
}

在这里插入图片描述