Что такое структура (stuct) в Go? Зачем они нужны?go-31

Что такое структура в Go?

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

type Person struct {
    Name string
    Age  int
    Address string
}

Основные характеристики структур

  1. Поля: Каждое поле имеет имя и тип
  2. Именованные типы: Создаются с помощью ключевого слова type
  3. Value-тип: Передаются по значению (копируются)
  4. Нулевое значение: Все поля инициализируются нулевыми значениями своих типов

Зачем нужны структуры?

1. Группировка связанных данных

type Circle struct {
    X, Y, Radius float64
}

2. Создание сложных моделей данных

type Order struct {
    ID       string
    Customer Person
    Items    []Product
    Total    float64
}

3. Реализация методов

func (p Person) Greet() string {
    return "Hello, " + p.Name
}

4. Работа с JSON и другими форматами

type Config struct {
    Host     string `json:"host"`
    Port     int    `json:"port"`
    Timeout  int    `json:"timeout,omitempty"`
}

Основные операции со структурами

Создание экземпляра

// 1. Инициализация с нулевыми значениями
var p1 Person

// 2. Инициализация с значениями
p2 := Person{"Alice", 30, "Moscow"}

// 3. Именованная инициализация
p3 := Person{
    Name:    "Bob",
    Age:     25,
    Address: "London",
}

Доступ к полям

fmt.Println(p3.Name) // Чтение
p3.Age = 26         // Запись

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

p4 := Person{"Alice", 30, "Moscow"}
fmt.Println(p2 == p4) // true, если все поля равны

Особенности структур в Go

  1. Встраивание структур (композиция вместо наследования):
type Employee struct {
    Person  // Встроенная структура
    Salary float64
}
  1. Теги структур (метаданные для полей):
type User struct {
    ID   int    `db:"id" json:"user_id"`
    Name string `db:"name" json:"user_name"`
}
  1. Анонимные структуры:
temp := struct {
    X int
    Y int
}{10, 20}
  1. Указатели на структуры:
ptr := &Person{Name: "Alice"}
fmt.Println((*ptr).Name) // Явное разыменование
fmt.Println(ptr.Name)    // Неявное разыменование

Практический пример

package main

import "fmt"

type Rectangle struct {
    Width, Height float64
}

// Метод для структуры
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func main() {
    rect := Rectangle{10, 5}
    fmt.Println("Area:", rect.Area()) // Area: 50
}

Резюмируем

  • Структуры — это составные типы данных для группировки полей
  • Основные применения:
    • Организация сложных данных
    • Создание предметно-ориентированных моделей
    • Реализация методов (ООП-стиль)
    • Работа с внешними форматами данных (JSON, БД)
  • Особенности Go:
    • Композиция через встраивание
    • Value-семантика
    • Теги для метаданных
    • Поддержка методов
  • Структуры — фундаментальный строительный блок для создания сложных типов данных в Go