Golang实现Set

package set

import "fmt"

type void struct{}
type Set struct {
	m map[any]void
}

// 创建一个新的集合
func NewSet(items ...any) *Set {
	s := &Set{}
	s.m = make(map[any]void)
	s.Add(items...)
	return s
}

// 向集合中添加元素
func (s *Set) Add(items ...any) {
	for _, item := range items {
		s.m[item] = void{}
	}
}

// 判断集合中是否包含item
func (s *Set) Contains(item any) bool {
	_, ok := s.m[item]
	return ok
}

// 返回集合大小
func (s *Set) Size() int {
	return len(s.m)
}

// 移除集合元素
func (s *Set) Remove(item any) {
	delete(s.m, item)
}

// 清空集合
func (s *Set) Clear() {
	s.m = make(map[any]void)
}

// 判断两个集合是否相等
func (s *Set) Equal(other *Set) bool {
	if s.Size() != other.Size() {
		return false
	}
	for key := range s.m {
		// 只要有一个不相等,就返回false
		if !other.Contains(key) {
			return false
		}
	}
	return true
}

func (s *Set) IsSubSet(other *Set) bool {
	if s.Size() > other.Size() {
		return false
	}
	for key := range s.m {
		if !other.Contains(key) {
			return false
		}
	}
	return true
}

// 求并集
func Union(set1 *Set, set2 *Set) *Set {
	newSet := NewSet()
	for key := range set1.m {
		newSet.Add(key)
	}
	for key := range set2.m {
		newSet.Add(key)
	}
	return newSet
}

// 求交集
func InterSet(set1, set2 *Set) *Set {
	newSet := NewSet()
	for key := range set1.m {
		if set2.Contains(key) {
			newSet.Add(key)
		}
	}
	return newSet
}

// 求差集
// 差集(A - B):所有属于集合 A 但不属于集合 B 的元素。
func Difference(set1, set2 *Set) *Set {
	newSet := NewSet()
	for key := range set1.m {
		if !set2.Contains(key) {
			newSet.Add(key)
		}
	}
	return newSet
}

func (s *Set) String() string {
	str := ""
	for key, _ := range s.m {
		str += fmt.Sprintf("%v,", key)
	}
	if len(s.m) > 0 {
		str = str[:len(str)-1] // 去掉最后的逗号和空格
	}
	return str
}