Sobes.tech
Senior

How do you iterate over an ordered map while preserving order? Implementation of the iteration method.

sobes.tech AI

Answer from AI

In Go, the standard map does not guarantee iteration order. To iterate over a map while preserving order, you need to use an additional structure, such as a slice of keys that maintains the insertion order.

Example implementation of an ordered map with an iteration method:

package orderedmap

type OrderedMap struct {
    keys []string
    data map[string]interface{}
}

func NewOrderedMap() *OrderedMap {
    return &OrderedMap{
        keys: make([]string, 0),
        data: make(map[string]interface{}),
    }
}

func (om *OrderedMap) Set(key string, value interface{}) {
    if _, exists := om.data[key]; !exists {
        om.keys = append(om.keys, key)
    }
    om.data[key] = value
}

func (om *OrderedMap) Get(key string) (interface{}, bool) {
    val, ok := om.data[key]
    return val, ok
}

func (om *OrderedMap) Iterate(f func(key string, value interface{})) {
    for _, key := range om.keys {
        f(key, om.data[key])
    }
}

Usage:

om := NewOrderedMap()
om.Set("first", 1)
om.Set("second", 2)
om.Iterate(func(k string, v interface{}) {
    fmt.Println(k, v)
})

Thus, the order of keys is preserved in the slice, and during iteration, we go through the keys in the desired order.

How do you iterate over an ordered map while… - sobes.tech