Go 语言 Set 集合简单实现

栏目: Go · 发布时间: 7年前

内容简介:在

在 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用到了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

图论算法理论、实现及应用

图论算法理论、实现及应用

王桂平//王衍//任嘉辰 / 北京大学 / 2011-1 / 54.00元

《图论算法理论、实现及应用》系统地介绍了图论算法理论,并选取经典的ACM/ICPC竞赛题目为例题阐述图论算法思想,侧重于图论算法的程序实现及应用。《图论算法理论、实现及应用》第1章介绍图的基本概念和图的两种存储表示方法:邻接矩阵和邻接表,第2~9章分别讨论图的遍历与活动网络问题,树与图的生成树,最短路径问题,可行遍性问题,网络流问题,支配集、覆盖集、独立集与匹配,图的连通性问题,平面图及图的着色问......一起来看看 《图论算法理论、实现及应用》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具