内容简介:在
在 Go
语言中是否有 Set
实现?
Set
是一种集合类数据结构,可以用来存储一系列的值,这些值无顺序,且不能重复。
Go
标准库中是没有的,不过我们可以通过原生的 map
自己实现。
map
可以用来存储 key-value
数据集合, key
默认无序,且不能重复,正好符合 set
的集合属性。
可以像这样定义一个类型的 set 结构:
var InterfaceSet map[interface{}]bool var IntSet map[int]bool var StringSet map[string]bool
甚至可以把 map
中的 value
的值用 struct{}
代替, stuct{}
是 0 个字节,bool 是 1 个字节。
var InterfaceSet map[interface{}]struct{} var IntSet map[int]struct{} var StringSet map[string]struct{}
以一个 string set
为例,看看如何操作 set
:
// 声明一个 string set s := make(map[string]struct{}) // set 中添加元素 s["Bingo"] = struct{}{} s["Huang"] = struct{}{} // set 中查询某个元素是否存在(判断 exist 为 true 还是 false) _, exist := s["Bingo"] // set 中删除某个元素 delete(s, "Bingo") // 遍历 set 中所有元素 for v := range s { fmt.Println(v) }
以上是最简单的实现版本,但是不够直观,我们可以封装成更友好的方式,提供增删改查方法,如下:
package main import ( "fmt" ) type set struct { m map[string]struct{} } func NewSet() *set { s := &set{} s.m = make(map[string]struct{}) return s } func (s *set) Add(v string) { s.m[v] = struct{}{} } func (s *set) Contains(v string) bool { _, c := s.m[v] return c } func (s *set) Remove(v string) { delete(s.m, v) } func main() { s := NewSet() s.Add("Bingo") s.Add("Huang") fmt.Println(s.Contains("Bingo")) fmt.Println(s.Contains("Huang")) s.Remove("Bingo") fmt.Println(s.Contains("Bingo")) }
我把这段代码放在了 GitHubGist 中 golang-set 。
如果你还要考虑线程安全,或者更地道的实现,可以看看这个 Github仓库 ,还被 Docker 、Kubernetes用到了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- tinyscript 1.2.0 发布了,注重集合类处理的脚本语言
- Scala 中的集合(二):集合性能比较
- Scala 中的集合(二):集合性能比较
- 《面试知识,工作可待:集合篇》:Java 集合面试知识大全
- 如何对集合对象求合计,然后追加在该集合对象中
- MongoDB指南---14、特殊的索引和集合:固定集合、TTL索引、全文本索引
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。