GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - mroth/orderedmap: 🐜 ordered map implementation for Go

BranchesTags
Open more actions menu

Latest commit

 

History

35 Commits
35 Commits

Folders and files

NameName
Last commit message
Last commit date
.github
.github
 
 
LICENSE
LICENSE
 
 
README.md
README.md
 
 
example_test.go
example_test.go
 
 
go.mod
go.mod
 
 
iter.go
iter.go
 
 
iter_test.go
iter_test.go
 
 
orderedmap.go
orderedmap.go
 
 
orderedmap_test.go
orderedmap_test.go
 
 

Repository files navigation

orderedmap 🐜

Go Reference

Optimal, constant time implementation of ordered maps for Go with a simple API.

Supports modern range-over-function iteration via the standard library iter package.

Usage

Basic operations

Creating an ordered map uses any generic type K comparable, V any:

// equivalent of: make(map[string]int)
m := orderedmap.New[string, int]()

You can specify an initial capacity hint:

// equivalent of: make(map[string]int, 1000)
m := orderedmap.WithCapacity[string, int](1000)

Setting a value:

// equivalent of m["foo"] = 1
m.Set("foo", 1)

Retrieving a value is equally simple, and uses the same bool ok secondary return pattern to indicate whether a value was found in the map:

// equivalent of val, ok := m["foo"]
val, ok := m.Get("foo")

The remaining operations mirror the standard library map:

m.Delete("foo") // equivalent of delete(m, "foo")
m.Clear()       // equivalent of clear(m)
n := m.Len()    // equivalent of len(m)

Iteration ✨

You can simply range across the All() function, which will yield key value pairs based on their insertion order:

for k, v := range m.All() {
    fmt.Printf("k = %v, v = %v\n", k, v)
}

See also Backward() to iterate from newest to oldest instead, as well as the included Keys() and Values() iterators.

Support

This module requires go1.24 or greater.

Comparison with other Go modules

Upon my review, wk8/go-ordered-map appeared to be the best existing library, offering constant time operations and reasonable memory footprint. This module took some design cues from it. That said, there are some intentional design differences -- comparing this module with it, we optimize for:

  • 🐛 Simpler API (less exposed surface area, similar to standard library maps).
  • 🌱 Reduced feature set (no built-in YAML serialization, for example).
  • ✨ Use modern range-over-function expressions for easy iteration.
  • ⚡ Equally performant.
  • 0️⃣ Zero dependencies.

Other alternatives

As per other options, the README from wk8/go-ordered-map offers a summary:

  • iancoleman/orderedmap only accepts string keys, its Delete operations are linear.
  • cevaris/ordered_map uses a channel for iterations, and leaks goroutines if the iteration is interrupted before fully traversing the map.
  • mantyr/iterator also uses a channel for iterations, and its Delete operations are linear.
  • samdolan/go-ordered-map adds unnecessary locking (users should add their own locking instead if they need it), its Delete and Get operations are linear, iterations trigger a linear memory allocation.

About

🐜 ordered map implementation for Go

Topics

data-structuresgogo-modulegolang

Resources

Readme
MIT license

Code of conduct

Code of conduct
Activity

Stars

0 stars

Watchers

1 watching

Forks

0 forks
Report repository

Releases

Packages

Used by

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.