23 Коллекции
Как устроена map и что будет при чтении отсутствующего ключа?
Ответ
map[K]V — это неупорядоченный набор пар. Чтение отсутствующего ключа возвращает нулевое значение типа V и не паникует. Чтобы отличить «лежит ноль» от «ключа нет», берут второе значение: n, ok := age[name].
Подробнее
В nil-карту можно читать — получишь нулевое значение. Запись в неё паникует. Перед записью нужна карта из make или литерала map[K]V{}.
delete(m, k) по отсутствующему ключу ничего не делает. Порядок обхода range специально не зафиксирован и меняется от запуска к запуску.
package main
import "fmt"
func main() {
age := map[string]int{"Аня": 30}
age["Боря"] = 25
if n, ok := age["Нет"]; !ok {
fmt.Println("ключа нет, нулевое значение", n)
}
fmt.Println("len", len(age))
delete(age, "Аня")
var empty map[string]int
fmt.Println("чтение nil-карты", empty["x"])
}