Итерация и порядок
Учитывайте случайный порядок элементов map
«Итерация и порядок» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Перебор отображения
Используйте range, чтобы перебрать отображение и получить каждый ключ и значение.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2}
for k, v := range m {
fmt.Println(k, v)
}
}Порядок случаен
Порядок перебора отображения не гарантируется. Go намеренно меняет его случайным образом. При повторном запуске одного и того же цикла ключи могут выводиться в другом порядке.
Зачем нужен случайный порядок
Go намеренно меняет порядок, чтобы разработчики случайно не начинали полагаться на определённый порядок. Код, зависящий от порядка элементов отображения, рано или поздно создаст ошибку.
Только ключи
Не указывайте значение, если хотите перебрать только ключи.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
for k := range m {
fmt.Println(k)
}
}Сбор ключей
Чтобы получить стабильный результат, сначала соберите ключи в срез.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
keys := []string{}
for k := range m {
keys = append(keys, k)
}
fmt.Println("collected", len(keys), "keys")
}Сортировка ключей
Отсортируйте собранные ключи, а затем переберите срез. Это даёт детерминированный упорядоченный вывод.
package main
import (
"fmt"
"sort"
)
func main() {
m := map[string]int{"c": 3, "a": 1, "b": 2}
keys := []string{}
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k, m[k])
}
}Шаблон упорядоченного вывода
Шаблон «собрать, затем отсортировать» — стандартный способ вывести отображение в предсказуемом порядке. Всегда сортируйте ключи, если порядок вывода имеет значение.
Сортировка целочисленных ключей
Та же идея работает с числовыми ключами и sort.Ints.
package main
import (
"fmt"
"sort"
)
func main() {
m := map[int]string{3: "c", 1: "a", 2: "b"}
keys := []int{}
for k := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
fmt.Println(k, m[k])
}
}Изменение во время перебора
Во время цикла перебора можно безопасно удалять ключи. Но добавление ключей во время перебора имеет неопределённое поведение: новые записи могут появиться, а могут и не появиться.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
for k := range m {
if k == "b" {
delete(m, k)
}
}
fmt.Println(len(m))
}Сортировка по значению
Чтобы упорядочить элементы по значению, а не по ключу, соберите ключи, а затем отсортируйте их с помощью сравнения, которое читает значения из отображения.
package main
import (
"fmt"
"sort"
)
func main() {
m := map[string]int{"a": 3, "b": 1, "c": 2}
keys := []string{}
for k := range m {
keys = append(keys, k)
}
sort.Slice(keys, func(i, j int) bool {
return m[keys[i]] < m[keys[j]]
})
for _, k := range keys {
fmt.Println(k, m[k])
}
}Никогда не полагайтесь на порядок
Главный вывод: никогда не предполагайте определённый порядок перебора отображения. Если порядок важен, извлеките ключи в срез и явно отсортируйте их.
Быстрая проверка
Вам нужно вывести записи отображения в алфавитном порядке ключей. Какой подход правильный?
Итоги
Перебор и порядок:
- порядок перебора отображения намеренно случаен
- соберите ключи, отсортируйте их, а затем переберите для получения детерминированного вывода
- удаление во время перебора безопасно, а добавление имеет неопределённое поведение
Изучай Go с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Итерация и порядок» бесплатный?
Да — полный текст урока «Итерация и порядок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Итерация и порядок»?
Учитывайте случайный порядок элементов map Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Итерация и порядок»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.