前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go实现一个set

go实现一个set

作者头像
公众号guangcity
发布2021-08-26 10:51:31
4980
发布2021-08-26 10:51:31
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

go实现一个set

在golang中没有内置的set,我们可以使用map[interface{}]bool或者map[interface{}]struct{}实现。

为了支持任意类型元素,我们可以使用空接口interface{},实现set这里使用struct{}

代码语言:javascript
复制
type exists struct{}
type set struct {
 m map[interface{}]exists
}

基本的操作如下:

  • NewSet

去调用Add函数添加一堆元素到set中

代码语言:javascript
复制
func NewSet(items ...interface{}) *set {
 s := &set{}
 s.m = make(map[interface{}]exists)
 s.Add(items...)
 return s
}
  • Add

将元素列表插入到set中

代码语言:javascript
复制
func (s *set) Add(items ...interface{}) {
 for _, item := range items {
  s.m[item] = exists{}
 }
}
  • Remove

删除指定元素

代码语言:javascript
复制
func (s *set) Remove(item interface{}) {
 delete(s.m, item)
}
  • 查询

基本的map查询操作即可

代码语言:javascript
复制
func (s *set) Contains(item interface{}) bool {
 _, ok := s.m[item]
 return ok
}
  • 其他基本操作
代码语言:javascript
复制
func (s *set) Contains(item interface{}) bool {
 _, ok := s.m[item]
 return ok
}

func (s *set) Size() int {
 return len(s.m)
}

最后聊一下为啥这里可以用struct{}?

因为你去比较两个struct{}时会发现是相等的。

例如:

代码语言:javascript
复制
s1 := struct{}{}
s2 := struct{}{}
fmt.Printf("s1 address:%p, s2 address:%p\n", &s1, &s2)
fmt.Println(s1 == s2)

此时输出:

代码语言:javascript
复制
s1 address:0x1190370, s2 address:0x1190370
true

可以看到地址一样,比较也相等, 空结构体大小多少呢

代码语言:javascript
复制
fmt.Println(unsafe.Sizeof(struct{}{}))

结果为0,精彩呀,不占用内存。放在map构造的set简直无敌,完成了下面两个工作:

  • 节省资源
  • 仅作为占位符

上面set使用:

代码语言:javascript
复制
func main() {
 s := NewSet("beijing", "beijing", "shanghai", 101)
 s.Add(false)
}

本节完~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • go实现一个set
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档