Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: Go, map, iteration, concurrency, safety

Можно ли изменять map во время итерации по ней в Go?

Проверяет понимание безопасности итерации по map в Go и правил конкурентного доступа.

Короткий ответ

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

Длинный ответ

Изменение map во время итерации в Go

В Go можно изменять map (добавлять или удалять элементы) во время итерации по ней с помощью цикла for range. Однако это может привести к непредсказуемому поведению, так как порядок итерации по map не гарантирован и может меняться при модификации.

Правила и особенности

  • Удаление элементов: Удаление текущего или любого другого ключа во время итерации безопасно. Удаленный ключ может быть или не быть посещен в текущей итерации.
  • Добавление элементов: Добавление новых ключей во время итерации может привести к тому, что новый ключ появится в текущей итерации или нет. Это зависит от внутренней реализации map.
  • Изменение значений: Изменение значения существующего ключа безопасно и будет видно в текущей итерации.

Пример кода

package main

import "fmt"

func main() {
    m := map[string]int{"a": 1, "b": 2, "c": 3}
    for k, v := range m {
        fmt.Println(k, v)
        if k == "a" {
            delete(m, "b") // удаление безопасно
            m["d"] = 4     // добавление может быть не видно
        }
    }
    fmt.Println(m)
}

Рекомендации

Для безопасной модификации map во время итерации рекомендуется сначала собрать все ключи в слайс, а затем изменять map по этим ключам. Если требуется конкурентный доступ, используйте мьютексы или sync.Map.

Вывод

Изменение map во время итерации возможно, но чревато неопределенным поведением. Лучше избегать этого или использовать безопасные паттерны, такие как копирование ключей, чтобы гарантировать предсказуемость кода.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Golang

    Golang

Ключевые слова

#Go

#map

#iteration

#concurrency

#safety

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.