golang没有原生的set
要实现set可以使用map来简易实现
定义一个Set可以这么定义
type Set[T comparable] struct {
set map[T]struct{}
}
为什么map的值类型用struct{}
?
因为struct{}
不占内存
package main
import (
"fmt"
"strings"
)
type Set[T comparable] struct {
set map[T]struct{}
}
// 新建Set对象
func NewSet[T comparable]() *Set[T] {
s := new(Set[T])
s.set = make(map[T]struct{})
return s
}
// 插入数据
func (s *Set[T]) Insert(v T) {
s.set[v] = struct{}{}
}
// 删除数据
func (s *Set[T]) Pop(v T) {
delete(s.set, v)
}
// 判断包含关系
func (s *Set[T]) Contains(v T) bool {
for k := range s.set {
if k == v {
return true
}
}
return false
}
// 转换为切片
func (s *Set[T]) ToList() []T {
res := make([]T, 0, len(s.set))
for k := range s.set {
res = append(res, k)
}
return res
}
func main() {
// 初始化
s := NewSet[int]()
// 测试插入操作
for i := 0; i < 10; i++ {
s.Insert(i)
}
sb := new(strings.Builder)
for _, v := range s.ToList() {
sb.WriteString(fmt.Sprintf("%v, ", v))
}
fmt.Println(sb.String())
sb.Reset()
// 测试删除操作
s.Pop(0)
for _, v := range s.ToList() {
sb.WriteString(fmt.Sprintf("%v, ", v))
}
fmt.Println(sb.String())
// 测试包含关系
fmt.Println(s.Contains(1))
}
标签:set,struct,实现,fmt,golang,Set,func,sb
From: https://www.cnblogs.com/poifa/p/17058967.html