|
| 1 | +[](https://travis-ci.org/deckarep/golang-set) |
| 2 | +[](http://godoc.org/github.com/deckarep/golang-set) |
| 3 | + |
| 4 | +## golang-set |
| 5 | + |
| 6 | + |
| 7 | +The missing set collection for the Go language. Until Go has sets built-in...use this. |
| 8 | + |
| 9 | +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 from Python. |
| 10 | +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 |
| 11 | +and carry-on and to the rest that find this useful please contribute in helping me make it better by: |
| 12 | + |
| 13 | +* Helping to make more idiomatic improvements to the code. |
| 14 | +* Helping to increase the performance of it. ~~(So far, no attempt has been made, but since it uses a map internally, I expect it to be mostly performant.)~~ |
| 15 | +* Helping to make the unit-tests more robust and kick-ass. |
| 16 | +* Helping to fill in the [documentation.](http://godoc.org/github.com/deckarep/golang-set) |
| 17 | +* Simply offering feedback and suggestions. (Positive, constructive feedback is appreciated.) |
| 18 | + |
| 19 | +I have to give some credit for helping seed the idea with this post on [stackoverflow.](http://programmers.stackexchange.com/questions/177428/sets-data-structure-in-golang) |
| 20 | + |
| 21 | +*Update* - as of 3/9/2014, you can use a compile-time generic version of this package in the [gen](http://clipperhouse.github.io/gen/) framework. This framework allows you to use the golang-set in a completely generic and type-safe way by allowing you to generate a supporting .go file based on your custom types. |
| 22 | + |
| 23 | +## Features (as of 9/22/2014) |
| 24 | + |
| 25 | +* a CartesionProduct() method has been added with unit-tests: [Read more about the cartesion product](http://en.wikipedia.org/wiki/Cartesian_product) |
| 26 | + |
| 27 | +## Features (as of 9/15/2014) |
| 28 | + |
| 29 | +* a PowerSet() method has been added with unit-tests: [Read more about the Power set](http://en.wikipedia.org/wiki/Power_set) |
| 30 | + |
| 31 | +## Features (as of 4/22/2014) |
| 32 | + |
| 33 | +* One common interface to both implementations |
| 34 | +* Two set implementations to choose from |
| 35 | + * a thread-safe implementation designed for concurrent use |
| 36 | + * a non-thread-safe implementation designed for performance |
| 37 | +* 75 benchmarks for both implementations |
| 38 | +* 35 unit tests for both implementations |
| 39 | +* 14 concurrent tests for the thread-safe implementation |
| 40 | + |
| 41 | + |
| 42 | + |
| 43 | +Please see the unit test file for additional usage examples. The Python set documentation will also do a better job than I can of explaining how a set typically [works.](http://docs.python.org/2/library/sets.html) Please keep in mind |
| 44 | +however that the Python set is a built-in type and supports additional features and syntax that make it awesome. |
| 45 | + |
| 46 | +## Examples but not exhaustive: |
| 47 | + |
| 48 | +```go |
| 49 | +requiredClasses := mapset.NewSet() |
| 50 | +requiredClasses.Add("Cooking") |
| 51 | +requiredClasses.Add("English") |
| 52 | +requiredClasses.Add("Math") |
| 53 | +requiredClasses.Add("Biology") |
| 54 | + |
| 55 | +scienceSlice := []interface{}{"Biology", "Chemistry"} |
| 56 | +scienceClasses := mapset.NewSetFromSlice(scienceSlice) |
| 57 | + |
| 58 | +electiveClasses := mapset.NewSet() |
| 59 | +electiveClasses.Add("Welding") |
| 60 | +electiveClasses.Add("Music") |
| 61 | +electiveClasses.Add("Automotive") |
| 62 | + |
| 63 | +bonusClasses := mapset.NewSet() |
| 64 | +bonusClasses.Add("Go Programming") |
| 65 | +bonusClasses.Add("Python Programming") |
| 66 | + |
| 67 | +//Show me all the available classes I can take |
| 68 | +allClasses := requiredClasses.Union(scienceClasses).Union(electiveClasses).Union(bonusClasses) |
| 69 | +fmt.Println(allClasses) //Set{Cooking, English, Math, Chemistry, Welding, Biology, Music, Automotive, Go Programming, Python Programming} |
| 70 | + |
| 71 | + |
| 72 | +//Is cooking considered a science class? |
| 73 | +fmt.Println(scienceClasses.Contains("Cooking")) //false |
| 74 | + |
| 75 | +//Show me all classes that are not science classes, since I hate science. |
| 76 | +fmt.Println(allClasses.Difference(scienceClasses)) //Set{Music, Automotive, Go Programming, Python Programming, Cooking, English, Math, Welding} |
| 77 | + |
| 78 | +//Which science classes are also required classes? |
| 79 | +fmt.Println(scienceClasses.Intersect(requiredClasses)) //Set{Biology} |
| 80 | + |
| 81 | +//How many bonus classes do you offer? |
| 82 | +fmt.Println(bonusClasses.Cardinality()) //2 |
| 83 | + |
| 84 | +//Do you have the following classes? Welding, Automotive and English? |
| 85 | +fmt.Println(allClasses.IsSuperset(mapset.NewSetFromSlice([]interface{}{"Welding", "Automotive", "English"}))) //true |
| 86 | +``` |
| 87 | + |
| 88 | +Thanks! |
| 89 | + |
| 90 | +-Ralph |
| 91 | + |
| 92 | +[](https://bitdeli.com/free "Bitdeli Badge") |
| 93 | + |
| 94 | +[](https://github.com/igrigorik/ga-beacon) |
0 commit comments