• Stars
    star
    3,971
  • Rank 10,991 (Top 0.3 %)
  • Language
    Go
  • License
    Other
  • Created over 11 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A simple, battle-tested and generic set type for the Go language. Trusted by Docker, 1Password, Ethereum and Hashicorp.

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/5/2023

  • Packaged version: 2.2.0 release includes a refactor to minimize pointer indirection, better method documentation standards and a few constructor convenience methods to increase ergonomics when appending items Append or creating a new set from an exist Map.
  • supports new generic syntax
  • Go 1.18.0 or higher
  • Workflow tested on Go 1.20

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.

Install

Use go get to install this package.

go get github.com/deckarep/golang-set/v2

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

Star History

Star History Chart

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 struct {
  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

More Repositories

1

gosx-notifier

gosx-notifier is a Go framework for sending desktop notifications to OSX 10.8 or higher
Go
585
star
2

EasyCert

EasyCert quickly generates web server TLS certificates that have been self-signed by a private certificate authority that it also creates.
Go
134
star
3

flappy-rust

A Rust SDL2 clone of Flappy Gopher which is a clone of Flappy Bird
Rust
66
star
4

sync-map-analysis

Comparing usage and performance of Go's regular map backed by a RWLock vs sync.map.
Go
38
star
5

blade

a remote SSH command-line runner based on YAML recipe files.
Go
31
star
6

corebench

corebench - run your benchmarks against high performance computing servers with many CPU cores
Go
30
star
7

apfs-compactor

Compaction tool proof-of-concept for deduplicating files and saving more space by exploiting APFS with the goal of saving disk space.
Go
28
star
8

KaraokeBerry

KaraokeBerry is a Python based web-app that allows you to play Karaoke CDG/MP3 files on your Raspberry Pi and remotely choose songs, manage a queue and host a Karaoke party from your mobile devices without ever touching the Raspberry Pi.
Python
26
star
9

ziglang-set

A generic and general purpose Set implementation for the Zig language
Zig
21
star
10

objective-go

Some examples of calling Objective-C code using Cgo from the Go programming language.
Go
8
star
11

zig-notebook

A repository to mess around in the Zig language - try things out, record notes, etc.
C
7
star
12

TornadoZeroMQ-WS-Demo

Demonstrates using Tornado Web Sockets with data published from a ZeroMQ process.
6
star
13

zig-agi

Classic Sierra AGI Interpreter in Zig
C
4
star
14

Nebula

Three.js Chrome visual experiment by Airtight
JavaScript
4
star
15

karaoke4go

An implementation of the Karaoke CDG file-format for Go
JavaScript
4
star
16

garyburd_websocket

http://gary.beagledreams.com/page/go-websocket-chat.html
Go
3
star
17

sci-hacking

Information on reverse engineering, hacking and patching classic SCI Sierra games with ScummVM
3
star
18

tips

tips: The command-line tool to wrangle your Tailscale tailnet cluster whether large or small.
Go
3
star
19

performance-go

A repository dedicated to writing performant Go.
2
star
20

SCI-Rave-Hires-Portrait-Encoder

A utility to encode RAVE Hires Character Portraits for the Sierra game King's Quest 6
Go
2
star
21

all-about-dem-virtual-machines

Repo for my notes on creating interpreters/virtual machines
2
star
22

raylib-coro-demo

Raylib with coroutines using the C-based neco project
C++
2
star
23

benchstat-js

Benchstat.js -- allows you to paste in Go benchmarks and have them analyzed by Benchstat
JavaScript
2
star
24

upload-go

Examples in multipart uploading
Go
2
star
25

eazy-duz-it

Python
1
star
26

python-vm-internals

Inspecting Python3 bytecode internals - with some notes
Python
1
star
27

ofKaraoke

Karaoke CDG app made with OpenFrameworks platform using C++
C++
1
star
28

cloud-chromioke

Chromecast Karaoke in the Cloud
Shell
1
star
29

pyxel-chip8

The CHIP-8 virtual machine implemented in the Pyxel fantasy console.
Python
1
star
30

lc3-zig

The LC3 virtual machine implemented in Zig.
Zig
1
star
31

harmony

Procedural Drawing Tool
JavaScript
1
star
32

bin-patcher

a descriptor based patching sequencer
Go
1
star
33

kafka-websocket-consumer

Consumes from Kafka and sends writes data to an HTML websocket connection.
Go
1
star
34

resume-template

Fork this, fill out the resume.json, turn-on GitHub Pages and Rock On!
JavaScript
1
star
35

gorganize

Just some durrdy code to move files around and organize shit...mostly photos and videos.
Go
1
star
36

GoQuest

A simple room-based adventure game that the world can play.
Go
1
star