go语言中有set集合吗
发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,本文小编为大家详细介绍"go语言中有set集合吗",内容详细,步骤清晰,细节处理妥当,希望这篇"go语言中有set集合吗"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。go语
千家信息网最后更新 2025年02月22日go语言中有set集合吗
本文小编为大家详细介绍"go语言中有set集合吗",内容详细,步骤清晰,细节处理妥当,希望这篇"go语言中有set集合吗"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
go语言没有set集合。Set是一个集合,set里的元素不能重复;golang的标准库中没有对set的操作,但有两种实现方法:1、使用map实现,map中的key为唯一值,这与set的特性一致;2、使用golang-set包实现。
本教程操作环境:windows10系统、GO 1.11.2、Dell G3电脑。
Go中是不提供Set类型,Set是一个集合,set里的元素不能重复。但可以使用两种方法set集合:
map
golang-set
使用map实现
在Golang中通常使用map来实现set,map中的key为唯一值,这与set的特性一致。
简单实现,如下:
set := make(map[string]bool) // New empty setset["Foo"] = true // Addfor k := range set { // Loop fmt.Println(k)}delete(set, "Foo") // Deletesize := len(set) // Sizeexists := set["Foo"] // Membership
map的value值是布尔型,这会导致set多占用内存空间,解决这个问题,则可以将其替换为空结构。在Go中,空结构通常不使用任何内存。
unsafe.Sizeof(struct{}{}) // 结果为 0
优化后,如下:
type void struct{}var member voidset := make(map[string]void) // New empty setset["Foo"] = member // Addfor k := range set { // Loop fmt.Println(k)}delete(set, "Foo") // Deletesize := len(set) // Size_, exists := set["Foo"] // Membership
golang-set
golang-set-A simple set type for the Go language. Also used by Docker, 1Password, Ethereum.
在github上已经有了一个成熟的包,名为golang-set,包中提供了线程安全和非线程安全的set。提供了五个set函数:
// NewSet创建并返回空集的引用,结果集上的操作是线程安全的func NewSet(s ...interface{}) Set {}// NewSetFromSlice从现有切片创建并返回集合的引用,结果集上的操作是线程安全的func NewSetFromSlice(s []interface{}) Set {}// NewSetWith创建并返回具有给定元素的新集合,结果集上的操作是线程安全的func NewSetWith(elts ...interface{}) Set {}// NewThreadUnsafeSet创建并返回对空集的引用,结果集上的操作是非线程安全的func NewThreadUnsafeSet() Set {}// NewThreadUnsafeSetFromSlice创建并返回对现有切片中集合的引用,结果集上的操作是非线程安全的。func NewThreadUnsafeSetFromSlice(s []interface{}) Set {}
简单案例,如下:
package mainimport ( "fmt" "github.com/deckarep/golang-set")func main() { // 默认创建的线程安全的,如果无需线程安全 // 可以使用 NewThreadUnsafeSet 创建,使用方法都是一样的。 s1 := mapset.NewSet(1, 2, 3, 4) fmt.Println("s1 contains 3: ", s1.Contains(3)) fmt.Println("s1 contains 5: ", s1.Contains(5)) // interface 参数,可以传递任意类型 s1.Add("poloxue") fmt.Println("s1 contains poloxue: ", s1.Contains("poloxue")) s1.Remove(3) fmt.Println("s1 contains 3: ", s1.Contains(3)) s2 := mapset.NewSet(1, 3, 4, 5) // 并集 fmt.Println(s1.Union(s2))}
结果为:
s1 contains 3: trues1 contains 5: falses1 contains poloxue: trues1 contains 3: falseSet{1, 2, 4, poloxue, 3, 5}
读到这里,这篇"go语言中有set集合吗"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
安全
线程
结果
语言
元素
文章
方法
一致
内存
内容
是非
特性
类型
结构
空集
妥当
成熟
使用方法
函数
参数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
研究生数学题软件开发
国家水稻数据库宏科517
华硕灵耀怎么进入网络安全
网络安全法是哪年通过的
上海常用软件开发制造价格
数据库可以更改列名么
全国计算机数据库mysql考试
广东推广软件开发
数据库表修改字段名称
煤矿无人值守软件开发
大量图片保存在数据库
update数据库不生效
2020年国内外网络安全
计算机网络技术需要什么笔记本
比较矢量数据和栅格数据库
适用于网络安全的关键领域
计算机网络技术三大结构
大华行为管理服务器
广东web前端软件开发价钱
基因网络技术进化
移动社交软件开发怎么样
海康威视综合管理平台服务器接口
吉林大学数据库视频
python 软件开发
互联网金融与金融科技一样吗
网络安全公司名片
商城网站服务器管理条件
网络安全居安思危备则无患
文件在数据库的字段名称
百万服务器价格查询