Как проверить наличие ключа в map Go: value, ok и delete
В Go чтение отсутствующего ключа map возвращает нулевое значение типа. Для map[string]int это 0, но ноль может быть и сохранённым значением. Используйте два результата: value, ok := counts[key]. Флаг ok показывает именно наличие ключа.
Короткий пример
package main
import "fmt"
func main() {
counts := map[string]int{"ready": 0}
value, ok := counts["ready"]
fmt.Println(value, ok)
value, ok = counts["missing"]
fmt.Println(value, ok)
delete(counts, "ready")
_, ok = counts["ready"]
fmt.Println(ok)
}
Результат:
0 true 0 false false
delete безопасен и для отсутствующего ключа. Если нужно сообщить, существовал ли удалённый ключ, сохраните ok до удаления. Порядок обхода map не гарантируется: сравнивайте содержимое по ключам.
Попробуйте самостоятельно
Ниже — отдельное задание с другими данными. Напишите решение и запустите проверку кода без регистрации. Для последовательного обучения откройте курс.
Удаление из словаря отмеченных слов
Словарь частот — привычный инструмент везде, где нужно отслеживать, сколько раз встречается то или иное слово: в анализе текста, при составлении статистики, в игровой логике. Такой словарь может быть подготовлен заранее и уже содержать записи, в том числе слова с нулевой частотой — зарезервированные позиции, которые ещё не получили реальных появлений. Когда поступает новый список слов, возможно включающий повторы, каждое появление увеличивает соответствующую частоту в словаре.
После того как частоты обновлены, возникает необходимость убрать из словаря одну конкретную запись — пометить её как более не актуальную. Удаление производится по ключу, и здесь важна точность: нужно отличить ситуацию, когда ключ действительно присутствовал в словаре и был успешно удалён, от ситуации, когда такого ключа в словаре никогда не было. Ноль в качестве значения не означает отсутствия ключа, поэтому проверка строится именно на факте присутствия или отсутствия ключа, а не на его числовом значении.
Программа должна вернуть итоговое состояние словаря со всеми оставшимися частотами и ясно обозначить, состоялось ли удаление — то есть был ли указанный ключ найден и изъят из словаря.
Что уже дано
Начальная map может содержать слово со значением 0; это всё равно существующий ключ.
Что нужно сделать
Реализуйте TrackUnknownWords(words []string, initial map[string]int, remove string) UnknownWordReport. Скопируйте начальные частоты, прибавьте появления слов из words, затем удалите ключ remove. Поле Removed должно быть true, если ключ существовал перед удалением, даже когда его значение было нулём. Поле Counts содержит оставшиеся частоты; порядок map не является частью результата.
Ввод и вывод
Проверяющая система вызывает функцию с подготовленным списком слов, начальными частотами и ключом удаления. Она сравнивает возвращаемые Counts и Removed. Читать stdin и печатать результат не нужно.
Пример
- Ввод
[["go","map","go"],{"old":2},"map"]- Вывод
{"Counts":{"go":2,"old":2},"Removed":true}
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Go for и continue: пропуск чётных чисел в цикле
- Go: обход массива [7]int и возврат среза []int
- Go append и базовый массив: почему меняется исходный срез
- Go fmt.Sprintf: форматирование строки и числа с двумя знаками
- Go if и switch: несколько значений в одной ветке
- Go strings.Split и strconv.ParseFloat: сумма чисел в строке
