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

Как реализовать упорядоченную map (ordered map) в Go, которая гарантирует порядок ключей при итерации?

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

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

sobes.tech AI

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

Пример реализации упорядоченной map:

package main

import "fmt"

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

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

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

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

func (om *OrderedMap) Keys() []string {
    return om.keys
}

func main() {
    om := NewOrderedMap()
    om.Set("apple", 5)
    om.Set("banana", 3)
    om.Set("cherry", 7)

    for _, key := range om.Keys() {
        val, _ := om.Get(key)
        fmt.Printf("%s: %d\n", key, val)
    }
}

Такой подход гарантирует сохранение порядка вставки ключей при итерации.