hashset——Golang实现

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)
}

hashset——Golang实现

上一篇:go每日新闻(2021-12-27)——Go1.18 新特性:TryLock 是什么?


下一篇:Windows 10使用Windows7图片查看器浏览图片