Sobes.tech
Назад к вопросам
Senior
1

Как итерировать по ordered map с сохранением порядка? Реализация метода итерации.

Компании, где спрашивали
Cloud.ru

Ответ от нейросети

sobes.tech AI

В Go стандартная map не гарантирует порядок итерации. Чтобы итерировать по map с сохранением порядка, нужно использовать дополнительную структуру, например, срез ключей, который хранит порядок вставки.

Пример реализации ordered map с методом итерации:

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])
    }
}

Использование:

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

Таким образом, порядок ключей сохраняется в срезе, и при итерации мы проходим по ключам в нужном порядке.