Menu
Coddy logo textTech

Проверка карт на nil

Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 28 из 68.

В Go карта (map) может находиться в специальном состоянии, называемом nil. Карта nil — это, по сути, неинициализированная карта, которая ни на что не указывает в памяти. Понимание этой концепции крайне важно, так как попытка добавить ключи в карту nil приведет к панике и аварийному завершению вашей программы.

Вот как возникает карта nil и как она выглядит:

var myMap map[string]int
// на данном этапе myMap равна nil

Когда вы объявляете переменную карты (map) без её инициализации, Go автоматически устанавливает её в nil. Хотя вы можете безопасно читать из nil карты (она вернет нулевое значение), попытка записи в неё вызовет панику (panic):

// Это безопасно - возвращает 0
value := myMap["key"]

// Это вызовет панику!
myMap["key"] = 42

Чтобы избежать этой проблемы, вам всегда следует проверять, является ли карта nil перед попыткой добавить в неё ключи. Проверка проста:

if myMap == nil {
    myMap = make(map[string]int)
}
myMap["key"] = 42 // Теперь это безопасно

Эта простая проверка гарантирует, что ваша программа не завершится аварийно при работе с потенциально неинициализированными картами, что делает ваш код более устойчивым и надежным.

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

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

Создайте систему безопасной инициализации карт, которая предотвращает ошибки паники, проверяя карты на nil перед попыткой выполнения операций записи. Эта задача демонстрирует критическую важность проверки состояния карты перед выполнением операций, которые могут привести к сбою вашей программы.

Вы получите два входных значения:

  • Строка, представляющая количество операций (например, "5")
  • Строка, содержащая операции в формате: "operation1:key1:value1,operation2:key2:value2", где операции могут быть "check", "init" или "add" (например, "check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")

Ваша задача:

  1. Создать две переменные карт типа map[string]int с именами scores и grades без их инициализации (они будут nil)
  2. Последовательно обработать каждую операцию из входной строки:
  3. Для операций "check":
    • Проверить, является ли указанная карта nil
    • Вывести "Map [map_name] is nil", если карта nil
    • Вывести "Map [map_name] is initialized", если карта не nil
  4. Для операций "init":
    • Инициализировать указанную карту с помощью make(map[string]int)
    • Вывести "Initialized map [map_name]"
  5. Для операций "add":
    • Сначала проверить, является ли карта nil
    • Если карта nil, вывести "Cannot add to nil map [map_name]"
    • Если карта не nil, добавить пару ключ-значение и вывести "Added [key]:[value] to [map_name]"
  6. Разобрать операции, разделив входную строку:
    • Разделить по запятым, чтобы получить отдельные операции
    • Для каждой операции разделить по двоеточиям, чтобы получить тип операции и параметры
    • Преобразовать строку значения в целое число для операций добавления
  7. После обработки всех операций отобразить конечное состояние обеих карт:
    • Для каждой карты, если она nil: "Final state - [map_name]: nil"
    • Для каждой карты, если она инициализирована: "Final state - [map_name]: [count] entries", где count — количество пар ключ-значение

Используйте пакет strconv для преобразования строк значений в целые числа для операций добавления. Эта задача демонстрирует, как проверка карт на nil перед операциями записи предотвращает панику во время выполнения и делает ваш код надежным и стабильным.

Шпаргалка

Карта nil — это неинициализированная карта, которая ни на что не указывает в памяти. Попытка добавить ключи в карту nil приведет к панике и аварийному завершению вашей программы.

Объявление карты без её инициализации создает карту nil:

var myMap map[string]int
// на данном этапе myMap равна nil

Чтение из карты nil безопасно (возвращает нулевое значение), но запись в неё вызовет панику:

// Это безопасно — возвращает 0
value := myMap["key"]

// Это вызовет панику!
myMap["key"] = 42

Всегда проверяйте, не является ли карта nil, перед добавлением ключей:

if myMap == nil {
    myMap = make(map[string]int)
}
myMap["key"] = 42 // Теперь это безопасно

Попробуйте сами

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Чтение входных данных
	var numOpsStr string
	var operationsStr string
	fmt.Scanln(&numOpsStr)
	fmt.Scanln(&operationsStr)
	
	// Объявление мап без инициализации (они будут nil)
	var scores map[string]int
	var grades map[string]int
	
	// Разделение операций по запятой
	operations := strings.Split(operationsStr, ",")
	
	// TODO: Напишите свой код ниже
	// Обработка каждой операции последовательно
	// Обработка операций "check", "init" и "add"
	// Для операций add используйте strconv.Atoi() для преобразования строкового значения в целое число
	
	// Вывод финального состояния обеих мап
	// Проверка, являются ли мапы nil или инициализированными, и соответствующий вывод
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком