Структуры (struct)

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

struct — составной тип, объединяющий несколько именованных полей. Это основа моделирования данных в Go вместо классов.

Объявление структуры

Структура описывает форму данных: набор полей с типами. В Go нет классов — структуры с методами берут на себя их роль.

package main

import "fmt"

type User struct {
    Name string
    Age  int
    Admin bool
}

func main() {
    var u User // все поля — нулевые значения
    fmt.Printf("%+v\n", u)
}

Вывод:

{Name: Age:0 Admin:false}

Глагол %+v печатает структуру вместе с именами полей — незаменим при отладке.

Способы инициализации

Структуру создают по-разному. Самый надёжный — с именами полей: код не сломается, если позже поля переставят местами.

package main

import "fmt"

type User struct {
    Name string
    Age  int
}

func main() {
    u1 := User{Name: "Аня", Age: 30}    // по именам полей
    u2 := User{"Борис", 25}              // по порядку (хрупко)
    u3 := User{Name: "Вера"}             // Age = 0
    p := &User{Name: "Глеб", Age: 40}   // сразу указатель

    fmt.Println(u1, u2, u3, p.Name)
}

Вывод:

{Аня 30} {Борис 25} {Вера 0} Глеб

К полям обращаются через точку: u1.Name. Структуры сравнимы оператором ==, если все их поля сравнимы.

Встраивание (embedding)

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

package main

import "fmt"

type Address struct {
    City string
}

type Employee struct {
    Name    string
    Address // встроено без имени поля
}

func main() {
    e := Employee{Name: "Аня", Address: Address{City: "Москва"}}
    fmt.Println(e.City) // напрямую, без e.Address.City
}

Вывод:

Москва

Поле City «поднялось» во внешнюю структуру. Это не наследование, а удобное делегирование: Employee просто содержит Address и переадресует обращения.

Итог

  • struct группирует именованные поля; классов в Go нет.
  • Инициализация по именам полей надёжнее, чем по порядку; %+v печатает поля с именами.
  • Встраивание даёт композицию вместо наследования: поля и методы поднимаются наружу.
Проверьте себя
1. Что заменяет классы в Go?
AМодули
BСтруктуры с методами
CИнтерфейсы
DПакеты
2. Почему инициализация по именам полей надёжнее, чем по порядку?
AОна быстрее
BКод не сломается, если поля переставят местами
CПо порядку запрещено
DИмена полей обязательны всегда
3. Что даёт встраивание структуры без имени поля?
AНаследование с переопределением
BПоля и методы встроенной структуры поднимаются во внешнюю (композиция)
CКопирование структуры
DЗапрет на изменение полей
Поддержать проект