Как отсортировать значения map (хэш-таблицы) по ключам в Go?

Ответ

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

  1. Извлечь ключи: Создать отдельный срез (slice) и скопировать в него все ключи из map.
  2. Отсортировать ключи: Использовать стандартный пакет sort для сортировки среза с ключами.
  3. Итерироваться по отсортированным ключам: Пройтись в цикле по отсортированному срезу ключей и, используя каждый ключ, получить соответствующее значение из исходной map.

Пример для ключей типа int

package main

import (
    "fmt"
    "sort"
)

func main() {
    m := map[int]string{
        3: "three",
        1: "one",
        4: "four",
        2: "two",
    }

    // 1. Получаем ключи
    keys := make([]int, 0, len(m))
    for k := range m {
        keys = append(keys, k)
    }

    // 2. Сортируем ключи
    sort.Ints(keys)

    // 3. Получаем значения по отсортированным ключам
    fmt.Println("Отсортированные значения:")
    for _, k := range keys {
        fmt.Printf("Ключ: %d, Значение: %sn", k, m[k])
    }
}

Вывод:

Отсортированные значения:
Ключ: 1, Значение: one
Ключ: 2, Значение: two
Ключ: 3, Значение: three
Ключ: 4, Значение: four

Общий подход для любых типов ключей

Для ключей других типов (например, string) используйте соответствующие функции (sort.Strings). Если ключи имеют сложный тип (например, структура), используйте sort.Slice с кастомной функцией сравнения.