Структуры (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печатает поля с именами. - Встраивание даёт композицию вместо наследования: поля и методы поднимаются наружу.