• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

deckarep/golang-set: A simple generic set type for the Go language. Trusted by D ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

deckarep/golang-set

开源软件地址:

https://github.com/deckarep/golang-set

开源编程语言:

Go 100.0%

开源软件介绍:

example workflow Go Report Card GoDoc

golang-set

The missing generic set collection for the Go language. Until Go has sets built-in...use this.

Update 3/26/2022

  • Packaged version: 2.0.0 release for generics support with breaking changes.
  • supports new generic syntax
  • Go 1.18.0 or higher

With Generics

Coming from Python one of the things I miss is the superbly wonderful set collection. This is my attempt to mimic the primary features of the set collection from Python. You can of course argue that there is no need for a set in Go, otherwise the creators would have added one to the standard library. To those I say simply ignore this repository and carry-on and to the rest that find this useful please contribute in helping me make it better by contributing with suggestions or PRs.

Features

  • NEW Generics based implementation (requires Go 1.18 or higher)
  • One common interface to both implementations
    • a non threadsafe implementation favoring performance
    • a threadsafe implementation favoring concurrent use
  • Feature complete set implementation modeled after Python's set implementation.
  • Exhaustive unit-test and benchmark suite

Trusted by

This package is trusted by many companies and thousands of open-source packages. Here are just a few sample users of this package.

  • Notable projects/companies using this package
    • Ethereum
    • Docker
    • 1Password
    • Hashicorp

Usage

The code below demonstrates how a Set collection can better manage data and actually minimize boilerplate and needless loops in code. This package now fully supports generic syntax so you are now able to instantiate a collection for any comparable type object.

What is considered comparable in Go?

  • Booleans, integers, strings, floats or basically primitive types.
  • Pointers
  • Arrays
  • Structs if all of their fields are also comparable independently

Using this library is as simple as creating either a threadsafe or non-threadsafe set and providing a comparable type for instantiation of the collection.

// Syntax example, doesn't compile.
mySet := mapset.NewSet[T]() // where T is some concrete comparable type.

// Therefore this code creates an int set
mySet := mapset.NewSet[int]()

// Or perhaps you want a string set
mySet := mapset.NewSet[string]()

type myStruct {
  name string
  age uint8
}

// Alternatively a set of structs
mySet := mapset.NewSet[myStruct]()

// Lastly a set that can hold anything using the any or empty interface keyword: interface{}. This is effectively removes type safety.
mySet := mapset.NewSet[any]()

Comprehensive Example

package main

import (
  "fmt"
  mapset "github.com/deckarep/golang-set/v2"
)

func main() {
  // Create a string-based set of required classes.
  required := mapset.NewSet[string]()
  required.Add("cooking")
  required.Add("english")
  required.Add("math")
  required.Add("biology")

  // Create a string-based set of science classes.
  sciences := mapset.NewSet[string]()
  sciences.Add("biology")
  sciences.Add("chemistry")
  
  // Create a string-based set of electives.
  electives := mapset.NewSet[string]()
  electives.Add("welding")
  electives.Add("music")
  electives.Add("automotive")

  // Create a string-based set of bonus programming classes.
  bonus := mapset.NewSet[string]()
  bonus.Add("beginner go")
  bonus.Add("python for dummies")
}

Create a set of all unique classes. Sets will automatically deduplicate the same data.

  all := required
    .Union(sciences)
    .Union(electives)
    .Union(bonus)
  
  fmt.Println(all)

Output:

Set{cooking, english, math, chemistry, welding, biology, music, automotive, beginner go, python for dummies}

Is cooking considered a science class?

result := sciences.Contains("cooking")
fmt.Println(result)

Output:

false

Show me all classes that are not science classes, since I don't enjoy science.

notScience := all.Difference(sciences)
fmt.Println(notScience)
Set{ music, automotive, beginner go, python for dummies, cooking, english, math, welding }

Which science classes are also required classes?

reqScience := sciences.Intersect(required)

Output:

Set{biology}

How many bonus classes do you offer?

fmt.Println(bonus.Cardinality())

Output:

2

Thanks for visiting!

-deckarep




鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap