bitset库实现了bitsets数据结构,这是一种正整数和布尔值映射关系的结构,它比map[uint]bool更高效

什么是bitsets

bitsets基本思想是用一个bit位来标记某个元素对应的Value,每一位表示一个数,1表示存在,0表示不存在 比如我要表示1, 3, 7这3个数

  1. 构造一个空白bitsets:00000000

  2. 每位代表的值如下:76543210

  3. 想要表示的值标记1:10001010

有什么好处?

最大的好处是节省存储空间,假设有20亿个正整数中找出m是否在其中 如果每个数字用int存储,占8byte,2000000000 * 8 = 14G 如果用bit存储每个数字,占1bit,2000000000 / 8 = 0.233G 由此可见bitsets节省了极大的存储空间

Usage

  1. 安装

go get github.com/bits-and-blooms/bitset
  1. 基本操作

// 构造一个64bit长度的bitset
b := bitset.New(64)
// 放入一个数
b.Set(10)
fmt.Println(b.DumpAsBits()) // 000000000000000000000000000000000000000000000000010000000000
// 删除一个值
b.Clear(10)
fmt.Println(b.DumpAsBits()) // 000000000000000000000000000000000000000000000000000000000000
// 长度
b.Set(1).Set(3)
fmt.Println(b.Len()) // 64
// 测试
fmt.Println(b.Test(3)) // true
fmt.Println(b.Test(4)) // false
  1. 指定位置操作

b := &bitset.BitSet{}
b.Set(3)
// 在指定位置插入0
b.InsertAt(3)
fmt.Println(b.DumpAsBits()) // 000000000000000000000000000000000000000000000000000000010000
// 在指定位置修改
b.SetTo(4, false)
fmt.Println(b.DumpAsBits()) // 000000000000000000000000000000000000000000000000000000000000
// 指定位置删除
b.Set(3).DeleteAt(3) // 000000000000000000000000000000000000000000000000000000000000
  1. 两个bitsets交互

a := &bitset.BitSet{}
a.Set(1).Set(3).Set(5)
b := &bitset.BitSet{}
b.Set(3).Set(5).Set(7)
// 交集
fmt.Println(a.Intersection(b)) // {3,5}
// 并集
fmt.Println(a.Union(b)) // {1,3,5,7}
// 差集
fmt.Println(a.Difference(b)) // {1}
// 全等
fmt.Println(a.Equal(b)) // false
  1. 遍历

b := bitset.New(64)
b.Set(1).Set(3).Set(5).Set(7)
for i, e := b.NextSet(0); e; i, e = b.NextSet(i + 1) {fmt.Println("The following bit is set:", i)
}
// The following bit is set: 1
// The following bit is set: 3
// The following bit is set: 5
// The following bit is set: 7

实例

假设现在数据库里有一个字段存储用户状态,设计是这样的:0 00 00 第1、2位表示会员等级 00表示普通会员,01表示vip1,10表示vip2,11表示svip 第3、4位表示头像状态 00表示未上传,01表示01审核中,10审核失败,11审核通过 第5位表示账号状状态 0表示正常,1表示封禁

b := bitset.New(5)
// 设置vip1,第1位0,第2位1
b.SetTo(1, false).SetTo(2, true)// 设置头像审核失败,第3位1,第4位0
b.SetTo(3, true).SetTo(4, false)// 状态初始化
b.ClearAll()// 查看账号状态,第5位,true代表1 false代表0
b.Test(5) // 是不是svip,第1、2位是11
b.Test(1) && b.Test(2)

总结✦

bitset/bitmap在日常开发中会经常用到,在特定场景下有很好的效果。这个库可以简化操作bitset/bitmap的难度,而且这个库的源码也很好的演示了go的位操作

官方文档:https://github.com/bits-and-blooms/bitset

《酷Go推荐》招募:

各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

新的库,并且知道怎么用。

大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名

扫码也可以加入 GoCN 的大家族哟~

「GoCN酷Go推荐」go语言位操作库 — bitset相关推荐

  1. 「GoCN酷Go推荐」Go 语言高性能图像处理神器 h2non/bimg

    0 推荐背景 日常业务开发中常会遇到各种图像处理需求,如,图片大小调整.翻转.旋转.提取大小.加水印.图片模糊化,格式转换,修剪等等:图像处理根据业务需求一部分图像处理需求在前端完成,如,用户裁剪编辑 ...

  2. 「GoCN酷Go推荐」后现代时代远程办公网络问题的golang开源解决方案 —— PairMesh...

    PairMesh是什么? Pairmesh是一款先进的虚拟局域网(VPN)工具,用来搭建与访问安全,易用,高性能的点对点的软件定义虚拟局域网,为远程办公的网络连接问题提供了开箱即用的解决方案. 拥抱开 ...

  3. 「GoCN酷Go推荐」​QQ机器人 go-cqhttp

    什么是 go-cqhttp?✦ QQ机器人,可以做的事儿太多了,比如一个UP主需要群发多个QQ群,以便通知粉丝们开播:再比如可以检测群内或发给自己的消息,而通过代码直接回复做的简单回复.比如检测群内有 ...

  4. 「GoCN酷Go推荐」高性能内存缓存 ristretto

    背景 ristretto 是 dgraph 团队开源的一款高性能内存缓存库,旨在解决高并发场景下的缓存性能和吞吐瓶颈.dgraph 专攻的方向是高性能图数据库,ristretto 就是其图数据库和 K ...

  5. 「GoCN酷Go推荐」快速搭建私有云服务 go-btfs

    # 1. go-btfs 是什么?# go-btfs 是一个去中心化的文件存储平台,无论图片.文件.视频等等各类文件.每个人都可以在自己电脑上安装部署 BTFS 节点,然后大家的节点相互连接,构成一个 ...

  6. 「GoCN酷Go推荐」JSON 数据获取器 JID

    01 推荐理由   JSON 格式数据适用范围非常广泛,一个内容丰富的json数据可能很大,使用 JID 可以让你非常舒服的获取到想要到数据. 02 简介 JID 是一个过滤JSON格式数据 cli ...

  7. 「GoCN酷Go推荐」Golang轻量级桌面程序wails2教学

    01 推荐理由 不依赖cgo!不依赖cgo!不依赖cgo!真的不依赖cgo,且跨平台,原生渲染 无嵌入式浏览器,轻量级,生成的文件很小,而且只有一个可执行文件就可运行. 02 功能介绍 后端使用标准 ...

  8. 「GoCN酷Go推荐」简单易用的性能分析工具——nitro

    #1 推荐理由 Golang官方在程序性能分析方面提供了用来分析cpu/内存等采样信息的pprof,以及用来追踪和分析运行时事件的trace,这两个工具对于分析程序的性能瓶颈可以说是得心应手.但是,对 ...

  9. 「GoCN酷Go推荐」漏桶限流库 — uber-go/ratelimit

    上次有同学分享了 单机限流器 time/rate 库,讲了 Golang 标准库中基于令牌桶实现限流组件的 time/rate 使用,同时也讲了一些限流算法原理. 这里分享一个 uber 开源的一套基 ...

最新文章

  1. Luogu T24242 购物券Ⅰ(数据已加强)
  2. nginx websocket proxy
  3. SpringBoot 2.0静态资源映射
  4. 找出两个字符串数组中的相同元素
  5. Spring Integration –轮询文件的创建和修改
  6. 十、request.getSession( )、reqeust.getSession(false)和 request.getSession(true)
  7. 物联网项目(三)平台架构
  8. 财务分析真不难!无需代码,一个模板直接复用,碾压上千Excel表
  9. a html w3c,HTML a 标签 | w3cschool菜鸟教程
  10. 为什么说CCSK是云安全从业人员必备证书之一
  11. 百人计划(图形部分)Bump Mapping(凹凸贴图映射技术)
  12. 慧鱼机器人编程18子程序
  13. FAT,FAT32,NTFS
  14. 多传感器融合定位-章节索引
  15. 互联网思维之社会化思维
  16. 电脑热点和虚拟机网卡冲突
  17. Android端FMODSoundTouch音频变声解决方案
  18. org.apache.kafka.clients.consumer.CommitFailedException
  19. 怎么还原计算机系统还原,怎么还原以前版本的windows?Win7/Win10系统还原方法
  20. 2020-08-31

热门文章

  1. 无线测温模块在轧钢厂的应用
  2. “一路向南,dream it possible”之旅--骑行从北京到成都(一)
  3. GlusterFs安装部署文档
  4. 浏览器使用默认端口9006连接TinyWebServer服务器连接不上?
  5. 微信/微博的图片处理?-android酷炫图片处理(下)
  6. xmap 配置php环境,xmap 的动态 - SegmentFault 思否
  7. 深度学习经典网络解析图像分类篇(二):AlexNet
  8. 台达PLC与单片机的通讯
  9. C/C++超市收银系统
  10. Informatica保障江苏电信规范化ETL开发