Что такое структура (struct) в Go и каковы её ключевые особенности?

Ответ

Структура (struct) в Go — это композитный тип данных, который позволяет сгруппировать вместе переменные (поля) разных типов под одним именем. Структуры являются основным способом создания сложных типов данных для представления сущностей из реального мира (например, Пользователь, Продукт).

type User struct {
    ID    int64
    Name  string
    Email string
    IsActive bool
}

Ключевые особенности и концепции:

  1. Передача по значению: По умолчанию структуры передаются в функции по значению, то есть создается полная копия. Для изменения исходной структуры или для избежания копирования больших данных используют указатели (*User).

  2. Методы: К структурам можно «привязывать» функции, которые называются методами. Это основной механизм инкапсуляции поведения в Go.

    func (u *User) Deactivate() {
        u.IsActive = false
    }
  3. Теги полей (Field Tags): Это строковые литералы, которые можно добавлять к полям структуры для предоставления метаинформации. Они широко используются в пакетах для сериализации (JSON, XML), работы с базами данных (ORM) и валидации.

    type User struct {
        ID   int64  `json:"id"`
        Name string `json:"name" db:"user_name"`
    }
  4. Встраивание (Embedding): Go не имеет наследования, но поддерживает композицию через встраивание. Одна структура может быть встроена в другую, и её поля и методы «поднимаются» на верхний уровень, становясь доступными напрямую.

    type Timestamps struct {
        CreatedAt time.Time
        UpdatedAt time.Time
    }
    
    type Post struct {
        Title string
        Body  string
        Timestamps // Встроенная структура
    }
    
    // p := Post{}
    // p.CreatedAt = time.Now() // Доступ к полю встроенной структуры