Структуры, указатели, методы и интерфейсы

Структуры и указатели: объявление, инициализация и передача по адресу

Содержание курса

До этого момента все данные, с которыми работали функции, были скалярными значениями или срезами. Структуры дают возможность собрать несколько полей разных типов в один именованный тип — и сразу поднимают вопрос о том, что происходит с этим набором данных при передаче в функцию.

Объявление struct и нулевые значения полей

Структура в Go — это способ ввести новый тип, который объединяет несколько полей под одним именем. Объявление выглядит так:

type Person struct {
    Name  string
    Age   int
    Score float64
    Active bool
}

type Person struct { ... } регистрирует Person как самостоятельный тип в пакете. После этого Person можно использовать везде, где допустим любой другой тип: как тип переменной, параметра функции, поля другой структуры.

Каждое поле имеет имя и тип — они могут быть любыми: string, int, float64, bool, другая структура. Нет требования, чтобы типы совпадали.

Что происходит, если просто объявить переменную такого типа без явной инициализации?

var p Person
fmt.Println(p.Name)   // ""
fmt.Println(p.Age)    // 0
fmt.Println(p.Score)  // 0
fmt.Println(p.Active) // false

Go инициализирует каждое поле нулевым значением своего типа: string — пустая строка, числовые типы — 0 или 0.0, boolfalse. Это не «мусор из памяти», а гарантия языка: нулевое значение структуры всегда определено.

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