Ответ
Да, чтение из неинициализированной (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 // Теперь это работает