Zero values: отсутствие undefined и логика инициализации данных

В TypeScript отсутствие значения — это выбор между null и undefined. Вам наверняка знакомы проверки if (user && user.profile), которые защищают фронтенд от ошибки «Cannot read property of undefined».

В Go неопределенных состояний для базовых типов не существует. Как только вы выделяете память под переменную, Go гарантирует, что она не будет содержать «мусора». Память сразу заполняется дефолтным значением.

Что такое Zero value

Zero value (нулевое значение) — это состояние переменной сразу после объявления, если вы не присвоили ей значение явно. Процесс выделения памяти и установки этого значения называется Initialization (инициализация).

В отличие от JavaScript, где обращение к отсутствующему свойству объекта вернет undefined, в Go компилятор следит, чтобы у каждой переменной было предсказуемое содержимое.

Как показано в Сравнении 1, это меняет подход к разработке: вам больше не нужно проверять, существует ли число или строка перед началом работы.

Таблица нулевых значений

Тип данныхZero valueКомментарий
int, float640Числа всегда обнуляются
string""Пустая строка (не nil)
boolfalseЛогический тип всегда «выключен»
Указатели, слайсы, мапыnilСсылочные типы указывают в никуда

Принцип полезного нулевого значения

В Go принято проектировать структуры так, чтобы их Zero value было рабочим. Это часто избавляет от написания конструкторов.

Рассмотрим счетчик. В React вам нужно задать useState(0). В Go достаточно объявить переменную:

package main

import "fmt"

func main() {
    var count int // Initialization происходит здесь, count равен 0
    count++       // В JS undefined + 1 даст NaN, в Go 0 + 1 даст 1
    
    fmt.Println(count) 
}

Понимание nil

Термин nil близок к null из JavaScript, но имеет свои особенности. Это нулевое значение для типов, которые являются ссылками на области памяти (слайсы, мапы, указатели, интерфейсы).

Если вы объявляете слайс (динамический массив), его начальное значение — nil. При этом многие встроенные функции Go умеют работать с nil корректно.

Пример: работа со слайсом без инициализации

var users []string // Нулевое значение — nil

// Проверка if (users == nil) не нужна, append справится сам
users = append(users, "Admin") 

fmt.Println(users) // [Admin]

Типичная ошибка после TypeScript

var name string
if name == nil { // ОШИБКА: mismatched types string and nil
    fmt.Println("Empty")
}
// Правильно: if name == "" { ... }

Инициализация структур

При создании структуры все её поля инициализируются своими Zero value рекурсивно. Объект готов к использованию сразу после объявления.

Напишите программу, которая объявляет переменные типов int, float64, string и bool без присваивания. Выведите их в консоль через fmt.Printf с флагом %v. Также попробуйте вывести слайс []int и сравнить его с nil.

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

В следующей теме мы разберем операторы адресации и разыменования, которые откроют доступ к указателям — одному из важнейших инструментов Go.

Понравился урок?

Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей

Продолжить в Telegram