Модульні уроки (1/5)
Визначення та використання структури
struct групує іменовані поля в один тип. Це шлях Го
побудови «об'єктів» — більш буквальних і безпосередніх, ніж класи, с
без успадкування та вбудованих конструкторів.
Декларація
type Person struct {
Name string
Age int
}type представляє новий іменований тип. Поля пишуться по одному
лінія, name type. Послідовні поля одного типу можуть спільно використовувати
декларація: X, Y int.
Створення
// 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Доступ до поля
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.
Наочність: правило великих літер
Поля з великими літерами експортуються (видимі з інших пакети); нижній регістр = приватний для поточного пакета.
type User struct {
Name string // exported
salt []byte // private to the package
}Те саме правило застосовується до кожного ідентифікатора в 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
}Порівнянність
Дві структури порівнюються з ==, якщо ВСІ їхні поля є
порівняння (без фрагментів/карт/функцій всередині):
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b) // trueЦе також дозволяє використовувати їх як ключі карти.
Спробуйте
Визначте тип особи за допомогою рядка імені та віку int, а потім створіть його як {ім’я: «Ада», вік: 36} у main.
Показати підказку
Синтаксис: `type Name struct { Тип поля; ... }`.
Рішення доступне після 3 спроб
Надрукуйте значення поля Ім'я p (існуюча особа).
Показати підказку
Доступ до поля: `p.Field`.
Рішення доступне після 3 спроб
Яка видимість поля «рядок назви» (нижній регістр) з іншого пакета?
// in package other
type X struct {
name string
}Підведення підсумків
type Name struct { ... }: новий іменований тип з іменованими полями.- Конструкція:
T{Field: value, ...}(рекомендовано) або позиційна. - Нульове значення: кожне поле має нульовий тип.
&T{...}таnew(T)для покажчика; неявне розіменування (p.Fieldна*T).- Великі літери = експортовано; нижній регістр = приватний для пакета.
- Структури можна порівняти з
==, якщо всі поля є; можна використовувати як ключі карти.