Перейти до основного вмісту
Модуль 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Завантаження…

Визначте тип особи за допомогою рядка імені та віку int, а потім створіть його як {ім’я: «Ада», вік: 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).
  • Великі літери = експортовано; нижній регістр = приватний для пакета.
  • Структури можна порівняти з ==, якщо всі поля є; можна використовувати як ключі карти.