Same as regular maps, but also remembers the order in which keys were inserted, akin to Python's collections.OrderedDict
s.
It offers the following features:
break
the iteration, and in time linear to the number of keys iterated over rather than the total length of the ordered mapinterface{}
s instead of using genericscontainer/list
The full documentation is available on pkg.go.dev.
go get -u github.com/wk8/go-ordered-map/v2
Or use your favorite golang vendoring tool!
Go >= 1.18 is required to use version >= 2 of this library, as it uses generics.
If you're running go < 1.18, you can use version 1 instead.
package main import ( "fmt" "github.com/wk8/go-ordered-map/v2" ) func main() { om := orderedmap.New[string, string]() om.Set("foo", "bar") om.Set("bar", "baz") om.Set("coucou", "toi") fmt.Println(om.Get("foo")) // => "bar", true fmt.Println(om.Get("i dont exist")) // => "", false // iterating pairs from oldest to newest: for pair := om.Oldest(); pair != nil; pair = pair.Next() { fmt.Printf("%s => %s\n", pair.Key, pair.Value) } // prints: // foo => bar // bar => baz // coucou => toi // iterating over the 2 newest pairs: i := 0 for pair := om.Newest(); pair != nil; pair = pair.Prev() { fmt.Printf("%s => %s\n", pair.Key, pair.Value) i++ if i >= 2 { break } } // prints: // coucou => toi // bar => baz }
An OrderedMap
's keys must implement comparable
, and its values can be anything, for example:
type myStruct struct { payload string } func main() { om := orderedmap.New[int, *myStruct]() om.Set(12, &myStruct{"foo"}) om.Set(1, &myStruct{"bar"}) value, present := om.Get(12) if !present { panic("should be there!") } fmt.Println(value.payload) // => foo for pair := om.Oldest(); pair != nil; pair = pair.Next() { fmt.Printf("%d => %s\n", pair.Key, pair.Value.payload) } // prints: // 12 => foo // 1 => bar }
Also worth noting that you can provision ordered maps with a capacity hint, as you would do by passing an optional hint to make(map[K]V, capacity
):
om := orderedmap.New[int, *myStruct](28)
You can also pass in some initial data to store in the map:
om := orderedmap.New[int, string](orderedmap.WithInitialData[int, string]( orderedmap.Pair[int, string]{ Key: 12, Value: "foo", }, orderedmap.Pair[int, string]{ Key: 28, Value: "bar", }, ))
OrderedMap
s also support JSON serialization/deserialization, and preserves order:
// serialization data, err := json.Marshal(om) ... // deserialization om := orderedmap.New[string, string]() // or orderedmap.New[int, any](), or any type you expect err := json.Unmarshal(data, &om) ...
Similarly, it also supports YAML serialization/deserialization using the yaml.v3 package, which also preserves order:
// serialization data, err := yaml.Marshal(om) ... // deserialization om := orderedmap.New[string, string]() // or orderedmap.New[int, any](), or any type you expect err := yaml.Unmarshal(data, &om) ...
There are several other ordered map golang implementations out there, but I believe that at the time of writing none of them offer the same functionality as this library; more specifically:
string
keys, its Delete
operations are linearDelete
operations are linearDelete
and Get
operations are linear, iterations trigger a linear memory allocationRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4