> Как правильно работать с map и структурой в Go, чтобы избежать паники (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
В Go паника при работе с map и структурами чаще всего возникает из-за записи в неинициализированную map или доступа к нулевому указателю внутри структуры. Основные правила:
-
Инициализация map: map нужно создавать через
make()или литералом. Запись в nil map вызывает панику.GOvar m map[string]intm["key"] = 1 // паника: assignment to entry in nil map// Правильно:m := make(map[string]int)m["key"] = 1 -
Чтение из nil map безопасно: возвращает zero value, но запись - нет.
-
Проверка существования ключа: используйте второе возвращаемое значение.
GOif val, ok := m["key"]; ok {// ключ существует} -
Структуры с указателями: если структура содержит map или указатель, инициализируйте их перед использованием.
GOtype Config struct {Data map[string]string}var c Configc.Data["key"] = "val" // паника: c.Data == nil// Правильно:c.Data = make(map[string]string)c.Data["key"] = "val" -
Горутины и конкурентный доступ: map не потокобезопасна. Используйте
sync.Mutexилиsync.Map.GOvar mu sync.Mutexmu.Lock()m["key"] = "val"mu.Unlock() -
Проверка на nil перед записью: всегда проверяйте, инициализирована ли map, особенно в аргументах функций.
GOfunc setValue(m map[string]int, key string, val int) {if m == nil {m = make(map[string]int)}m[key] = val}
Следуя этим правилам, вы избежите паники и сделаете код надёжным.
> Похожие задачи по backend
Писал ли юнит-тесты для bash-скриптов
Что такое кэширование и слои кэширования в контейнерах
Как сообщить клиенту о недоступности внешнего источника данных
Передается ли JWT в зашифрованном или открытом виде
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью