Можно ли читать из неинициализированной (nil) map в Go и что при этом произойдет?

Ответ

Да, чтение из неинициализированной (nil) map является безопасной операцией и не вызывает паники. При попытке чтения по ключу, которого нет (а в nil map нет никаких ключей), вернется нулевое значение для типа-значения этой map.

Однако, любая попытка записи в nil map приведет к runtime panic.

Пример чтения:

package main

import "fmt"

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

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

    // Как отличить отсутствующий ключ от ключа с нулевым значением?
    // Используйте идиому "comma, ok".
    value, ok := m["some_key"]
    fmt.Printf("Значение: %d, Ключ найден: %tn", value, ok) // Вывод: Значение: 0, Ключ найден: false
}

Пример записи:

package main

func main() {
    var m map[string]int // m == nil
    // Попытка записи в nil map вызовет панику
    m["some_key"] = 1 // panic: assignment to entry in nil map
}

Вывод: Перед тем как записывать данные в map, ее необходимо инициализировать с помощью make или литерала:

// Инициализация
m := make(map[string]int)
// или
// m := map[string]int{}

m["some_key"] = 1 // Теперь это работает