[БЕЗ_ЗВУКА] В этом видео мы рассмотрим такой тип составных данных, как структуры. По мере роста вашей программы бывает неудобно моделировать сущности набором скаляр, хочется объединить их как-то плотнее, чтобы они представляли собой единую сущность. Структуры — это как раз такое объединение. Давайте рассмотрим, как они объявляются. Структуры, как и все остальные типы в Go, объявляются через ключевое слово type, потом идёт имя этого типа struct, ключевое слово, и в фигурных скобках объявляются поля этой структуры. Полями структуры может быть абсолютно любой тип, который есть в Go, например, даже string, даже функция, либо другая структура, например, Person на строчке 15. Давайте посмотрим, как инициализируются структуры. Для того чтобы инициализировать структуры, мы можем воспользоваться либо полным форматом объявлений, когда в фигурных скобках мы указываем нужные нам поля, при этом мы можем пропустить какие-то поля, и тогда они примут значения по умолчанию. Либо же мы можем воспользоваться краткой формой объявления, когда нам не нужно указывать все поля структуры, имена всех полей структуры, но при этом нам нужно указать все поля структуры, мы не можем их пропускать. Обращение к полям структуры происходит через точку. Давайте посмотрим, что нам выведет эта программа. [ЗВУК] Смотрите. Изначально мы инициализировали структуру, у которой поле Owner не было указано. И оно получилось значением по умолчанию, то есть эта структура, у которой все её поля имеют значение по умолчанию. Ноль для целых чисел и пустые строки. Потом позже мы инициализировали её уже полноценно. Иногда бывает так, что мы хотим больше композиции. В Go нет ООП в классическом понимании, однако вся работа с объектами в Go построена на композиции. Например, мы можем встроить одну структуру в другую. Делается это так. В чем отличие Owner от Person? Дело в том, что Owner — это какое-то свойство структуры, а встроенный, заэмбедженный Person — это уже не свойство структуры, а часть самой структуры. И все поля Person являются частью структуры Account. Давайте посмотрим. Например, вы можете обращаться к этим полям непосредственно. Аккаунт, адрес. То есть Address является частью поля структуры Person, но, поскольку мы встроили Person в Account, то мы можем обращаться к полям Person непосредственно напрямую. Смотрите. У нас не объявлен Person, давайте его объявим. А при объявлении Person'а встроенной структуры, вам всё равно нужно объявлять её через префикс. Вот так. [ЗВУК] Moscow. Москва. Теперь давайте выведем. Запятая. Вот вывелось. Москва. То есть вывелось поле встроенной структуры, причём без того, чтобы я обращался к ней по префиксу. Но если у нас есть какие-то общие поля у структуры, в которую встраиваем, и встраиваемые структуры, то никакого конфликта не будет. Оба поля сохранятся. При этом при обращении к этому полю [ЗВУК] приоритет будет к наиболее верхнему полю структуры. rvasily — это поле Account, не поле Person, а поле Account. Теперь, если же мы хотим всё-таки обратиться к полю встроенной структуры Person, мы должны явно это указать. [ЗВУК] Теперь вывелся Василий. Давайте ещё раз посмотрим, в чём отличие. [ЗВУК] Сначала у нас выводится поле, которое мы объявили в типе Account, затем у нас выводится поле Name, которое мы объявили в структуре Person. При этом наша структура Account содержит оба этих поля. Если бы в нашей структуре Account не было поля, например, вот так, то тогда обращение к этому полю сразу вело бы к встроенной структуре.