Struct (структура)
В следующих главах мы рассмотрим:
-
что такое структура и внутреннее строение;
-
как создавать пользовательские типы;
-
как проанализировать занимаемую структурой память;
-
что такое композиция структур и как скомпоновать несколько структур в одну;
-
что такое встраивание структур и как это произвести.
Что такое структура
Struct — это набор разрозненных типов данных (разнородных), описывающих одну сущность. Например, пользователя с полями age int, name string.
Поля структуры типизированы, каждое поле имеет свой тип.
Поля или свойства в структурах хранятся в смежных местах памяти.
Структура имеет фиксированный размер, как массив.
Копии структуры ссылаются на разные области памяти.

Struct internal (внутреннее строение)

Как видим, наша структура Wallet занимает 32 байта. Давай посчитаем: в структуре четыре поля float64,
то есть каждое поле занимает 64 бита информации или 8 байт. Таких полей у нас четыре, получаем 32 байта. Посмотрим, как это
будет выглядеть в памяти, на этот раз размер каждого квадрата будет составлять 1 байт.

В памяти поля структуры идут друг за другом, занимая столько памяти, сколько выделяется под тип поля. Например, в нашем случае типом является uint64 — он занимает 8 байт памяти на одно поле или 32 байта памяти на всю структуру.
Пользовательские типы
Структуры в Golang являются одним из наиболее часто используемых способов создания пользовательских типов. Для объявления собственного типа воспользуемся служебной конструкцией type:
- Для начала создадим файл main.go по следующему пути — module2/types/composite/struct/main.go.

- Создадим свой пользовательский тип User со следующими полями.

3. Создадим переменную, используя наш тип User (пользователь), и выведем результат в консоль.

-> Строка 6–9 — объявление пользовательского типа User с двумя полями Age и Name.
-> Строка 13–16 — создаем переменную типа User, заполняя поля.
-> Строка 17 — вывод в консоль.
Анализ занимаемой памяти структурой
- Для примера, объявим еще один пользовательский тип Wallet (кошелек).

- Для просмотра занимаемой памяти создадим переменную с типом Wallet:
Для быстрой работы пользуемся автодополнением кода, пишем Wallet, далее Fill all fields.

Заполни нашу структуру в таком виде.

- Выведем размер нашей структуры, для этого воспользуемся пакетом unsafe.

Внимание! Ты можешь создавать пользовательские типы, используя в качестве базового любой тип.