← Назад к вопросам

Как устроена структура данных?

1.0 Junior🔥 301 комментариев
#Основы Go

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Устройство структуры данных в Go

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

Основные концепции

Объявление структуры осуществляется с помощью ключевого слова type в сочетании с struct:

// Объявление нового типа Person на основе структуры
type Person struct {
    FirstName string
    LastName  string
    Age       int
    Email     string
}

В этом примере создан тип Person с четырьмя полями разных типов: два поля типа string, одно поле типа int, и еще одно поле типа string. Поля структуры также называются свойствами или атрибутами.

Особенности работы со структурами

Создание экземпляров структуры может выполняться несколькими способами:

// 1. Использование полного литерала структуры
p1 := Person{
    FirstName: "Иван",
    LastName:  "Петров",
    Age:       30,
    Email:     "ivan@example.com",
}

// 2. Использование позиционного литерала (в порядке объявления полей)
p2 := Person{"Мария", "Иванова", 25, "maria@example.com"}

// 3. Создание с нулевыми значениями
var p3 Person // Все поля получат нулевые значения

// 4. Использование new() возвращает указатель
p4 := new(Person)

Доступ к полям структуры осуществляется через оператор точки:

fmt.Println(p1.FirstName) // Вывод: Иван
p1.Age = 31                // Изменение значения поля

Внутреннее представление

С точки зрения памяти, структуры в Go реализованы как непрерывный блок памяти, где поля располагаются последовательно в порядке их объявления. Компилятор может добавлять выравнивание (padding) между полями для оптимизации доступа к памяти, следуя правилам выравнивания конкретной архитектуры процессора.

Размер структуры можно узнать с помощью функции unsafe.Sizeof():

import "unsafe"

type Example struct {
    flag    bool    // 1 байт
    number  int32   // 4 байта
    pointer *string // 8 байт (на 64-битной системе)
}
// Фактический размер может отличаться из-за выравнивания

Ключевые возможности структур

  • Встраивание структур (embedding) — аналог наследования в ООП:
type Employee struct {
    Person          // Встраивание структуры Person
    Position string
    Salary   float64
}

emp := Employee{
    Person: Person{
        FirstName: "Алексей",
        LastName:  "Сидоров",
        Age:       35,
    },
    Position: "Разработчик",
    Salary:   150000.00,
}
fmt.Println(emp.FirstName) // Прямой доступ к полям встроенной структуры
  • Методы — функции, привязанные к конкретному типу структуры:
// Метод с получателем по значению
func (p Person) FullName() string {
    return p.FirstName + " " + p.LastName
}

// Метод с получателем по указателю (может изменять структуру)
func (p *Person) Birthday() {
    p.Age++
}
  • Теги структур — метаданные для полей:
type User struct {
    ID        int    `json:"id" db:"user_id"`
    Username  string `json:"username" validate:"required,min=3"`
    Password  string `json:"-"` // Поле игнорируется при сериализации JSON
}

Сравнение структур

Структуры в Go можно сравнивать операторами == и !=, если все их поля являются сравниваемыми типами:

type Point struct {
    X, Y int
}

p1 := Point{10, 20}
p2 := Point{10, 20}
p3 := Point{5, 15}

fmt.Println(p1 == p2) // true
fmt.Println(p1 == p3) // false

Преимущества структур

  • Типобезопасность — компилятор проверяет соответствие типов
  • Производительность — прямой доступ к памяти, минимум накладных расходов
  • Читаемость кода — поля имеют осмысленные имена
  • Гибкость — поддержка методов, интерфейсов и композиции
  • Эффективность памяти — компактное хранение данных

Структуры в Go — это основной механизм для создания сложных типов данных, который сочетает простоту синтаксиса с мощными возможностями для моделирования предметной области. Они широко используются для представления сущностей, конфигураций, запросов и ответов API, а также в качестве значимых объектов (value objects) в архитектуре приложений.

Как устроена структура данных? | PrepBro