Перейти к основному содержимому
Модуль 5 · Урок 1 из 521/50 в курсе~12 min
Уроки модуля (1/5)

Определение и использование структуры

struct группирует именованные поля в один тип. Это путь Го построения «объектов» — более буквального и непосредственного, чем классы, с нет наследования и нет встроенных конструкторов.

Декларация

Go
type Person struct {
    Name string
    Age  int
}

type представляет новый именованный тип. Поля записываются по одному линия, name type. Последовательные поля одного и того же типа могут иметь общий объявление: X, Y int.

Создание

Go
// with named fields (recommended: robust to reordering)
p := Person{Name: "Ada", Age: 36}

// positional (fragile: depends on declaration order)
q := Person{"Ada", 36}

// zero value: every field at its zero value
var r Person          // r = {Name: "", Age: 0}

// pointer: allocate with & or new
ptr := &Person{Name: "Ada"}
ptr2 := new(Person)   // *Person to a zero-value struct

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

Go
p := Person{Name: "Ada", Age: 36}
fmt.Println(p.Name, p.Age)

p.Age = 37            // mutation (if p is a variable)

С указателем ptr.Name работает напрямую: Go выполняет неявное разыменование. Нет ->, как в C.

Видимость: правило верхнего регистра

Поля с заглавной буквой экспортируются (видны из других пакеты); нижний регистр = частный для текущего пакета.

Go
type User struct {
    Name   string  // exported
    salt   []byte  // private to the package
}

То же правило применяется к каждому идентификатору в Go: типы, функции, переменные, поля.

Анонимные и вложенные структуры

Go
// anonymous (handy for ad-hoc data)
config := struct {
    Host string
    Port int
}{Host: "localhost", Port: 8080}

// nested
type Address struct {
    Street string
    City   string
}
type Customer struct {
    Name    string
    Address Address
}

Сопоставимость

Две структуры сравнимы с ==, если ВСЕ их поля сопоставимо (без срезов/карт/функций внутри):

Go
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b)   // true

Это также позволяет использовать их в качестве ключей карты.

Попробуйте это

Упражнение#go.m5.l1.e1
Попыток: 0Загрузка…

Определите тип Person с помощью строки Name и Age int, а затем создайте его экземпляр как {Name: 'Ada', Age: 36} в main.

Загрузка редактора…
Показать подсказку

Синтаксис: `type Name struct { Тип поля; ... }`.

Решение доступно после 3 попыток

Упражнение#go.m5.l1.e2
Попыток: 0Загрузка…

Выведите значение поля Имя для p (существующего человека).

Загрузка редактора…
Показать подсказку

Доступ к полю: `p.Field`.

Решение доступно после 3 попыток

Quiz#go.m5.l1.e3
Готово

Какова видимость поля «строка имени» (строчные буквы) из другого пакета?

Go
// in package other
type X struct {
    name string
}
Варианты ответа

Резюме

  • type Name struct { ... }: новый именованный тип с именованными полями.
  • Конструкция: T{Field: value, ...} (рекомендуется) или позиционная.
  • Нулевое значение: каждое поле имеет нулевое значение своего типа.
  • &T{...} и new(T) для указателя; неявное разыменование (p.Field на *T).
  • Прописные буквы = экспортировано; нижний регистр = частный для пакета.
  • Структуры сравнимы с ==, если все поля таковы; можно использовать в качестве ключей карты.