Александр Гольцман
Null, Nil, None, 0 в Go
В языке программирования Go (или Golang) нет привычного многим разработчикам null, а также не используется None как в Python. Вместо этого существуют свои понятия — nil для указателей, срезов, карт и каналов, а также 0 для числовых типов. В этой статье я расскажу, как Go обрабатывает отсутствие значений, почему здесь нет классического null и что стоит учитывать при работе с nil и нулевыми значениями.
Зачем нужен nil и откуда взялся null
В некоторых языках, например в C, C++ или Java, вы наверняка встречали null — специальное значение, указывающее на отсутствие объекта. В Go же есть своё ключевое слово nil, которое играет роль “пустого” значения для указателей, срезов, карт, каналов и некоторых других типов.
Смотрите, отсутствие классического null для базовых типов (чисел, строк, булевых значений) — это осознанное решение Go. Разработчики Go стремились избежать распространённых ошибок, связанных с null (пустыми ссылками и постоянными проверками на них), упростить код и повысить надёжность.
Понимание концепций null, nil, None, и 0 в Golang важно для корректной обработки отсутствующих или нулевых значений. Чтобы эффективно работать с этими концепциями, необходимо понимать особенности типов данных, уметь обрабатывать ошибки и использовать nil-значения для указателей, интерфейсов и слайсов. Если вы хотите детальнее изучить основы Golang, необходимые для понимания null, nil, None, и 0, рекомендуем наш курс Основы Golang. На курсе 193 уроков и 16 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
nil в Go
nil в Go можно встретить у следующих типов:
- Указатели (например,
int) - Срезы (
[]int) - Карты (
map[string]int) - Каналы (
chan int) - Функции (если их можно передавать как значения)
- Интерфейсы (когда у интерфейса нет конкретной реализации)
Когда переменная объявлена, но не инициализирована, она имеет значение nil, если относится к одному из вышеперечисленных типов.
Проверка на nil
Чтобы понять, инициализирована ли переменная, используют простое сравнение:
var ptr *int
if ptr == nil {
fmt.Println("Указатель не инициализирован")
}Или для среза:
var nums []int
if nums == nil {
fmt.Println("Срез пуст")
}Числовые типы и 0
В Go для числовых типов (int, float64) отсутствует понятие null. Вместо этого они имеют “нулевое” значение по умолчанию — 0 для целых и 0.0 для чисел с плавающей запятой.
Если вам нужно явно указывать, что число “не определено”, можно использовать указатель на число (*int), который может быть nil, или применять другие подходы, например, создавать специальные структуры, указывающие на отсутствие значения.
Строки и пустая строка
Строки в Go не могут быть nil. Если вы объявляете переменную типа string без инициализации, она будет иметь значение "" (пустая строка).
var s string
fmt.Println(s == "") // trueЧтобы указать “отсутствие строки”, используйте указатель на строку (*string), тогда он может быть nil.
Почему нет None или null?
В Python часто используется None, а в JavaScript — null. В Go разработчики пошли другим путём: базовые типы не могут быть nil, а для сложных типов используется nil как признак отсутствия данных. Это снижает риск случайных NullPointerException, типичных для других языков.
Смотрите, это философия Go: лучше явно объявить указатель, если нужно отсутствие объекта, чем иметь “пустое” значение для всего подряд.
Пример использования nil
Покажу на примере:
func main() {
var nums []int
if nums == nil {
fmt.Println("Срез nums не инициализирован")
nums = []int{1, 2, 3}
}
fmt.Println(nums) // [1 2 3]
}Здесь я проверил, что nums == nil, и инициализировал срез значениями.
Заключение
В Go отсутствуют классические null или None, и это сделано осознанно, чтобы уменьшить вероятность ошибок и упростить код. Вместо них используется nil для сложных типов (указателей, срезов, карт, каналов и интерфейсов) и нулевые значения для базовых типов (числа, строки, булевы переменные).
Давайте подведём итоги:
nil— специальное значение для указателей, срезов, карт, каналов и интерфейсов.- Числа и строки не могут быть
nil, по умолчанию имеют0и"". - Отсутствие классического
nullпомогает избежать распространённых ошибок, связанных с пустыми ссылками. - Для “неопределённых” чисел можно использовать указатель на число (
int) или специальные структуры, а неnull.
Этот подход делает код Go более надёжным и предсказуемым. Если вам действительно нужна семантика “пустого значения”, используйте указатели или специальные типы.
Для корректной работы с отсутствующими или нулевыми значениями в Golang необходимо уверенное знание основ языка. Чтобы понимать различия между nil для разных типов данных, необходимо знать, как работают указатели, интерфейсы и слайсы. Получить эти знания можно на курсе Основы Golang. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в Go прямо сегодня и станьте уверенным разработчиком.
Постройте личный план изучения Golang до уровня Middle — бесплатно!
Golang — часть карты развития Backend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Golang
Лучшие курсы по теме

Основы Golang
Антон Ларичев
Nest.js с нуля
Антон Ларичев