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


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

查看所有标签

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

R数据科学

R数据科学

[新西兰] 哈德利 • 威克姆、[美] 加勒特 • 格罗勒芒德 / 陈光欣 / 人民邮电出版社 / 2018-7 / 139.00元

本书的目标是教会读者使用最重要的数据科学工具,从而为实施数据科学奠定坚实的基础。读完本书后,你将掌握R语言的精华,并能够熟练使用多种工具来解决各种数据科学难题。每一章都按照这样的顺序组织内容:先给出一些引人入胜的示例,以便你可以整体了解这一章的内容,然后再深入细节。本书的每一节都配有习题,以帮助你实践所学到的知识。一起来看看 《R数据科学》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具