elliotchance/orderedmap
elliotchance/orderedmap has 1,029 GitHub stars and 78 forks. Star changes are not measured yet. Last checked 2026-11-09 11:53 UTC. Last push 2026-10-09.
🔃 An ordered map in Go with amortized O(1) for Set, Get, Delete and Len.
Measured star growth
- in 24h
- Update delayed
- in 7 days
- Update delayed
- in 15 days
- Update delayed
- in 1 month
- Update delayed
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
Original🔃 github.com/elliotchance/orderedmap/v3 
Basic Usage
An *OrderedMap is a high performance ordered map that maintains amortized O(1)
for Set, Get, Delete and Len:
import "github.com/elliotchance/orderedmap/v3"
func main() {
m := orderedmap.NewOrderedMap[string, any]()
m.Set("foo", "bar")
m.Set("qux", 1.23)
m.Set("123", true)
m.Delete("qux")
}
[!NOTE]
- v3 requires Go v1.23 - If you need to support Go 1.18-1.22, you can use v2.
- v2 requires Go v1.18 for generics - If you need to support Go 1.17 or below, you can use v1.
Internally an *OrderedMap uses the composite type
map combined with a
trimmed down linked list to maintain the order.
Iterating
The following methods all return iterators that can be used to loop over elements in an ordered map:
AllFromFront()AllFromBack()Keys()Values()
// Iterate through all elements from oldest to newest:
for key, value := range m.AllFromFront() {
fmt.Println(key, value)
}
Iterators are safe to use bidirectionally, and will return nil once it goes
beyond the first or last item. If the map is changing while the iteration is
in-flight it may produce unexpected behavior.
If you want to get a slice of the map keys or values, you can use the standard
slices.Collect method with the iterator returned from Keys() or Values():
fmt.Println(slices.Collect(m.Keys())
// [A B C]
Likewise, calling maps.Collect on the iterator returned from AllFromFront()
will create a regular unordered map from the ordered one:
fmt.Println(maps.Collect(m.AllFromFront())
// [A:1 B:2 C:3]
If you don't want to use iterators, you can also manually loop over the elements
using Front() or Back() with Next():
// Iterate through all elements from oldest to newest:
for el := m.Front(); el != nil; el = el.Next() {
fmt.Println(el.Key, el.Value)
}
// You can also use Back and Prev to iterate in reverse:
for el := m.Back(); el != nil; el = el.Prev() {
fmt.Println(el.Key, el.Value)
}
Explore related projects
codecrafters-io/build-your-own-x
Master programming by recreating your favorite technologies from scratch.
561,597 starspublic-apis/public-apis
A collective list of free APIs
497,924 starsmorluto/rea
Reverse engineer anything with agents, from app behavior down to native binaries.
449,772 starsopenclaw/openclaw
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
394,299 stars