set:不重复的数据集合
map:key-value键值对的数据集合
slice:数据类型相同的数据集合
以上3种数据类型都可以自动扩容。
package main
import (
"fmt"
"sync"
)
type HashSet struct {
Len int
m sync.Map
}
var value interface{}
func NewHashSet() *HashSet {
set := &HashSet{
Len: 0,
m: sync.Map{},
}
return set
}
func (hs *HashSet) put(data interface{}) bool {
if hs.isExist(data) {
fmt.Println("数据已经存在")
return false
}
hs.m.Store(data, value)
hs.Len++
return true
}
func (hs *HashSet) get() []interface{} {
if hs.Len == 0 {
return nil
}
res := make([]interface{}, 0, hs.Len)
hs.m.Range(func(key, value interface{}) bool {
res = append(res, key)
return true
})
return res
}
func (hs *HashSet) delete(data interface{}) bool {
if !hs.isExist(data) {
fmt.Println("数据不存在!")
return false
}
hs.m.Delete(data)
hs.Len--
return true
}
func (hs *HashSet) clear() {
hs.Len = 0
hs.m = sync.Map{}
}
func (hs *HashSet) isExist(data interface{}) bool {
_, ok := hs.m.Load(data)
return ok
}
func main() {
set := NewHashSet()
set.put(1)
set.put(2)
set.put(4)
set.put("hello")
fmt.Println(set.isExist("hello"))
fmt.Println(set.get())
set.delete(4)
fmt.Println(set.isExist("hello"))
fmt.Println(set.get())
fmt.Println("set大小:",set.Len)
}