Порядок обхода карты в Go
Порядок, в котором цикл отдает пары, не закреплен. Один и тот же код при разных запусках может напечатать строки в другой последовательности. На это нельзя опираться в логике программы.
Добавим три ключа по очереди и обойдем карту:
room := make(map[string]int)
room["first"] = 1
room["second"] = 2
room["third"] = 3
for k, v := range room {
fmt.Println(k, v)
}
На экране три строки, но порядок ключей может
не совпадать с порядком записи "first",
"second", "third". Сравнивать
удобнее по ключам внутри тела, а не по номеру строки
вывода.
Если нужен предсказуемый порядок, сначала собирают ключи в срез, сортируют срез в разделе про срезы и идут по нему, читая карту по каждому ключу. Здесь достаточно запомнить: обход карты сам по себе порядок не гарантирует.
ages := map[string]int{"ann": 20, "bob": 30}
for k := range ages {
fmt.Println(k)
}
Дана следующая карта:
room := map[string]int{"a": 1, "b": 2, "c": 3}
Обойдите room дважды подряд двумя
циклами и сравните вывод. Обязан ли порядок
совпасть между циклами?
Почему нельзя считать, что первый напечатанный ключ был добавлен первым?
Дана следующая карта:
line := map[string]int{"first": 1, "second": 2, "third": 3}
Выведите пары циклом и запишите, зависит ли порядок строк от порядка в литерале.