Что произойдет при попытке чтения или записи в неинициализированную (nil) map в Go?

Ответ

В Go работа с неинициализированной (нулевой, nil) map имеет свои особенности: чтение безопасно, а запись вызывает панику.


  1. Чтение из nil map

    При чтении из nil map вы не получите ошибку. Операция вернет нулевое значение для типа-значения этой map. Проверка наличия ключа с помощью идиомы value, ok := m["key"] также безопасна. Для nil map ok всегда будет false.



  2. Запись в nil map

    Попытка добавить или изменить элемент в nil map приведет к панике во время выполнения: panic: assignment to entry in nil map.


Пример:

package main

import "fmt"

func main() {
    var m map[string]int // m == nil

    // Чтение - безопасно
    fmt.Println(m["some_key"]) // Выведет: 0 (нулевое значение для int)

    value, ok := m["some_key"]
    fmt.Printf("Value: %d, OK: %vn", value, ok) // Выведет: Value: 0, OK: false

    // Запись - вызовет панику
    m["some_key"] = 1 // panic: assignment to entry in nil map
}

Решение:
Чтобы избежать паники, map необходимо инициализировать перед использованием с помощью функции make или литерала map:

// Способ 1: с помощью make
m := make(map[string]int)

// Способ 2: с помощью литерала
m := map[string]int{}