- Notifications
You must be signed in to change notification settings - Fork280
A simple, battle-tested and generic set type for the Go language. Trusted by GoogleCloudPlatform, Docker, 1Password, Ethereum and Hashicorp.
License
deckarep/golang-set
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
The missinggeneric set collection for the Go language. Until Go has sets built-in...use this.
- Hi there, 👋! Do you use or have interest in theZig programming language created by Andrew Kelley? If so, the golang-set project has a new sibling project:ziglang-set! Come check it out!
- Packaged version:
2.8.0introduces support for true iterators for Go 1.23+. Please seeissue #141for further details on the implications of how iterations work between older Go versions vs newer Go versions. Additionally, thisrelease has a minor unit-test spelling fix.
- Packaged version:
2.7.0fixes a long-standing bug withJSON Unmarshaling. A large refactor in the interest of performanceintroduced this bug and there was no way around it but to revert the code back to how it was previously. The performancedifference was likely negligible to begin with. JSON Marshaling and Unmarshaling is now properly supported again withoutneeding to do workarounds.
- Packaged version:
2.2.0release includes a refactor to minimize pointer indirection, better method documentation standards and a few constructor convenience methods to increase ergonomics when appending itemsAppendor creating a new set from an existMap. - supports
new genericsyntax - Go
1.18.0or higher - Workflow tested on Go
1.20
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.
Usego get to install this package.
go get github.com/deckarep/golang-set/v2
- NEWGenerics based implementation (requiresGo 1.18 or higher)
- One commoninterface to both implementations
- anon threadsafe implementation favoringperformance
- athreadsafe implementation favoringconcurrent use
- Feature complete set implementation modeled afterPython's set implementation.
- Exhaustive unit-test and benchmark suite
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
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 supportsgeneric syntax so you are now able to instantiate a collection for anycomparable type object.
What is considered comparable in Go?
Booleans,integers,strings,floatsor basically primitive types.PointersArraysStructsifall of their fields are also comparable independently
Using this library is as simple as creating either a threadsafe or non-threadsafe set and providing acomparable 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 setmySet:=mapset.NewSet[int]()// Or perhaps you want a string setmySet:=mapset.NewSet[string]()typemyStructstruct {namestringageuint8}// Alternatively a set of structsmySet:=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]()
package mainimport ("fmt" mapset"github.com/deckarep/golang-set/v2")funcmain() {// 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 willautomatically 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, pythonfor dummies}Is cooking considered a science class?
result:=sciences.Contains("cooking")fmt.Println(result)
Output:
falseShow 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, pythonfor 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
About
A simple, battle-tested and generic set type for the Go language. Trusted by GoogleCloudPlatform, Docker, 1Password, Ethereum and Hashicorp.
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
