Все вопросы

23 Коллекции

Как устроена map и что будет при чтении отсутствующего ключа?

map[K]V — это неупорядоченный набор пар. Чтение отсутствующего ключа возвращает нулевое значение типа V и не паникует. Чтобы отличить «лежит ноль» от «ключа нет», берут второе значение: n, ok := age[name].

В nil-карту можно читать — получишь нулевое значение. Запись в неё паникует. Перед записью нужна карта из make или литерала map[K]V{}.

delete(m, k) по отсутствующему ключу ничего не делает. Порядок обхода range специально не зафиксирован и меняется от запуска к запуску.

Пример

Go

запись, comma-ok и чтение nil-карты

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"])
}