Мапы в Go являются неупорядоченными коллекциями. Это означает, что при переборе ключей мапы определенный порядок не гарантирован. А как же получить ключи мапы в определенном порядке? Для этого можно создать слайс ключей мапы, отсортировать его и с его помощью получить значения мапы для каждого из ключей. Давайте посмотрим на пример кода, где будет описана функция, которая принимает мапу и возвращает отсортированный слайс ключей этой мапы:
C-like:
package main
import (
"fmt"
"sort"
)
func getSortedKeys(collection map[string]string) []string {
// создаем пустой слайс нулевой длины, в который будем добавлять ключи мапы
keys := make([]string, 0)
// перебираем ключи мапы, чтобы добавить их в созданный пустой слайс keys
for key := range collection {
keys = append(keys, key)
}
// сортируем слайс, используя функцию Strings из пакета sort
sort.Strings(keys)
// возвращаем отсортированный слайс
return keys
}
// теперь можео использовать этот отсортированный слайс для доступа к значениям мапы
func main() {
// слачала объявим мапу - это будут покемоны. Ключи - имена, значения - тип покемона
pokemons := map[string]string {
"СПРИГАТИТО": "Травяной",
"ФЛОРАГАТО": "Травяной",
"МЯУСКАРАДА": "Травяной",
"ФУЕКОКО": "Огненный",
"КРОКАЛОР": "Огненный",
"ЛЕЧОНК": "Нормальный",
"ПАВМИ": "Электрический",
}
// сначала выведем всех покемонов как есть, перебирая ключи и значения мапы
for key, val := range pokemons {
fmt.Println("Покемон:", key, "тип покемона:", val)
}
fmt.Println("______________________________________________")
// получаем отсортированный слайс ключей, вызвав функцию getSortedKey()
pokemonsNames := getSortedKeys(pokemons)
// выводим в алфавитном порядке имена покемонов с их типом
// перебираем слайс
for _, name := range pokemonsNames {
fmt.Println("Покемон:", name, "тип покемона:", pokemons[name])
}
}