因为Go没有Java的生态,正好自己又学过Java,想实现一个Set来。
Set的存入无序,输出是有序的,并且存储数据不重复,因此 我们可以使用map来存在:
本文章涉及到的知识点:
1.struct{} 空结构体 可以不占用内存
2.go 有自己的排序函数啦,在sort里面
3.自己实现排序也可以 只要实现了Len() Less() 以及Swap()方法就可以了
4.intterface{} 空接口可以用来存储任何数据类型 判断具体类型的时候 我们使用go 的特性 断言
代码实现
package main
import (
"fmt"
"sort"
)
type Empty struct{}
var empty Empty
type Set struct {
m map[interface{}]Empty
}
func SetFactory() *Set {
return &Set{
m: map[interface{}]Empty{},
}
}
// 添加元素
func (s *Set) Add(val interface{}) {
s.m[val] = empty // 使用一个empty 到单利作为所有键的值
}
// 删除元素
func (s *Set) Del(val interface{}) {
delete(s.m, val)
}
//清空set
func (s *Set) Clear() {
s.m = make(map[interface{}]Empty, 0)
}
// 查看一个元素是否存在
func (s *Set) Exist(val interface{}) bool {
_, ok := s.m[val]
return ok
}
//// 遍历Set
func (s *Set) Traverse() {
intVals := make([]int, 0)
strVals := make([]string, 0)
var t interface{}
fmt.Println(s)
for v := range s.m {
t = v
switch t.(type) {
case string: // t.(string) go intface 转成 其他数据类型 使用t.(string) 即可 t 要是intface类型
strVals = append(strVals, t.(string))
case int:
intVals = append(intVals, t.(int))
}
}
sort.Ints(intVals)
sort.Strings(strVals)
for _,v := range intVals {
fmt.Println(v)
}
for _,v := range strVals {
fmt.Println(v)
}
}
func (s *Set) Len() int {
return len(s.m)
}
使用:
package main
import "fmt"
func main() {
// 因为我们要更改里面的数据 所有需要用指针去修改数据, 也就是我们
s := SetFactory()
//s.Traverse()
for i := 0; i < 100; i++ {
s.Add("hello Go Set")
s.Add("hello Go Set111")
s.Add("hello Go Set2222")
s.Add("hello Go Set3333")
s.Add("hello Go Set4444")
s.Add(i)
}
s.Del("hello Go Set4444")
s.Del("hello Go Set")
k := s.Exist(3)
fmt.Println(k)
s.Traverse()
}