Материал проходит вычитку — возможны неточности.
Урок 35 из 118

Чтение, ok и delete

Хендлер GET /files/{id} отвечал одинаково на «файла нет» и «файл пуст»: в обоих случаях клиент получал пустоту. Аня поймала это на ревью, когда пустой файл клиента вернулся как «не найден».

Главная мысль

чтение отсутствующего ключа возвращает zero value, поэтому отличие «ключа нет» от «значение — ноль» даёт второе возвращаемое значение ok; delete безопасен для отсутствующего ключа и на nil-карте.

Отсутствующий ключ

Go

Чтение несуществующего ключа не ошибка: возвращается zero value типа значения. Для счётчиков это удобно: filesByID[k]++ работает, даже если ключа ещё не было.

Ok-идиома

Но zero value не различает «ключа нет» и «значение — ноль». Для этого у чтения есть вторая форма:

v, ok := filesByID["b"]
if !ok {
    fmt.Println("файла нет")
}

ok == true означает, что ключ в карте есть, и v — его значение, даже если оно нулевое. Это единственный способ отличить.

Delete безопасен

Go

delete не возвращает ошибок и не паникует на отсутствующем ключе. Вызвать его можно даже на nil-карте — ничего не произойдёт. Поэтому код очистки не нужно оборачивать в проверки.

В следующем уроке

Вы узнаете:

  • как отличаются счётчики через m[k]++ и через явный ok
  • как работать с nil-значениями в карте map[string]*FileMeta
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

m := map[string]int{}. Что выведет fmt.Println(m["x"]), а затем m["x"]++; fmt.Println(m["x"])?

Вопрос 2 из 3

delete(m, "missing") и delete на nil-карте — что произойдёт?

Вопрос 3 из 3

Как отличить «ключа нет» от «значение равно нулю»?

Итоги

Нет ключа → zero value; нужен факт наличия → v, ok := m[k]; delete безопасен для отсутствующего ключа и на nil-карте.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки