Уроки модуля (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Это также позволяет использовать их в качестве ключей карты.
Попробуйте это
Определите тип Person с помощью строки Name и Age int, а затем создайте его экземпляр как {Name: 'Ada', Age: 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).- Прописные буквы = экспортировано; нижний регистр = частный для пакета.
- Структуры сравнимы с
==, если все поля таковы; можно использовать в качестве ключей карты.