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


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

查看所有标签

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

写给大家看的算法书

写给大家看的算法书

【日】杉浦 贤 / 绝云 / 电子工业出版社 / 2016-6 / 59.00元

算法这个词对于非计算机从业人士而言,似乎就是晦涩、神秘的代名词。其实,算法在日常生活中随处可见。做饭用的菜谱是一种算法、查字典的方法是一种算法、给期中考试分数排名也用到了算法。事实上,算法可以说是这个信息爆炸的时代所依存的重要基石之一。 《写给大家看的算法书》对于理解信息处理的基础——算法而言,是一本非常优秀的入门读物。作者采用大量生动的类比,配合简洁易懂的配图,深入浅出地讲解算法,极大地拉......一起来看看 《写给大家看的算法书》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

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

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具