A thread-safe ordered dictionary implementation in Go that maintains insertion order while providing O(1) lookups, inserts, and deletes.
go get github.com/amoolaa/go-ordered-dictpackage main
import (
"fmt"
"github.com/amoolaa/go-ordered-dict"
)
func main() {
// Create a new ordered dictionary
dict := ordereddict.New[string, int]()
// Add items
dict.Set("first", 1)
dict.Set("second", 2)
dict.Set("third", 3)
// Get items
if val, ok := dict.Get("second"); ok {
fmt.Println(val) // Output: 2
}
// Check if key exists
if dict.Has("first") {
fmt.Println("Key exists")
}
// Get length
fmt.Println(dict.Len()) // Output: 3
// Delete items
if val, ok := dict.Delete("second"); ok {
fmt.Println("Deleted:", val)
}
// Pretty print the dictionary
fmt.Println(dict) // Output: OrderedDict[first:1 third:3]
}The String() method implements the Stringer interface, allowing you to easily print the dictionary in a format similar to Go's built-in maps:
dict := ordereddict.New[string, int]()
dict.Set("apple", 1)
dict.Set("banana", 2)
dict.Set("cherry", 3)
fmt.Println(dict) // Output: OrderedDict[apple:1 banana:2 cherry:3]
fmt.Printf("Dict: %v\n", dict) // Also works with Printf// Get all keys in insertion order
keys := dict.Keys()
fmt.Println(keys) // ["first", "third"]
// Get all values in insertion order
values := dict.Values()
fmt.Println(values) // [1, 3]
// Using iterator (Go 1.23+)
for key, val := range dict.All() {
fmt.Printf("%s: %d\n", key, val)
}dict := ordereddict.New[string, string]()
dict.Set("a", "first")
dict.Set("b", "second")
dict.Set("c", "third")
// Move to end
dict.MoveToEnd("a")
fmt.Println(dict.Keys()) // ["b", "c", "a"]
// Move to start
dict.MoveToStart("c")
fmt.Println(dict.Keys()) // ["c", "b", "a"]
// Move after another key
dict.MoveAfter("c", "a")
fmt.Println(dict.Keys()) // ["b", "a", "c"]// Create dictionary with pre-allocated capacity
dict := ordereddict.NewWithCapacity[string, int](100)- Thread-safe with read-write mutex
- Generic types support (Go 1.18+)
- O(1) insert, lookup, and delete operations
- Maintains insertion order
- Ability to reorder items
- Iterator support (Go 1.23+)
- Pretty printing via
String()method (implementsfmt.Stringer)