Вложенные структуры
Часть раздела Основы путешествия по GO на Coddy — урок 99 из 109.
Go позволяет встраивать одну структуру в другую, создавая отношения композиции. Это подход Go к наследованию.
Определите две структуры, одна из которых вложена в другую:
type Address struct {
city string
state string
}
type Person struct {
name string
age int
Address // встроенная структура (без имени поля)
}
func main() {
person := Person{
name: "Alice",
age: 30,
Address: Address{city: "Portland", state: "Oregon"},
}
// Доступ к полям напрямую
fmt.Println(person.city) // Доступ к встроенному полю
}
Вывод показывает, что мы можем обращаться к полям встроенной структуры напрямую:
PortlandЗадание
НовичокВ этом испытании вы попрактикуетесь в использовании встроенных структур (композиции) в Go.
У нас есть две структуры: Address и Person. Структура Person должна включать в себя структуру Address, чтобы человек мог напрямую обращаться к полям адреса.
Ваша задача — завершить определение структуры Person, встроив в нее структуру Address, а затем получить доступ к полям адреса напрямую из экземпляра person.
Шпаргалка
Go использует встраивание структур для композиции. Встройте одну структуру в другую, указав тип структуры без имени поля:
type Address struct {
city string
state string
}
type Person struct {
name string
age int
Address // встроенная структура (без имени поля)
}
Обращайтесь к полям встроенной структуры напрямую:
person := Person{
name: "Alice",
age: 30,
Address: Address{city: "Portland", state: "Oregon"},
}
fmt.Println(person.city) // Прямой доступ к встроенному полю
Попробуйте сами
package main
import "fmt"
// Структура Address содержит информацию о местоположении
type Address struct {
Street string
City string
ZipCode string
}
// Структура Person должна включать в себя структуру Address
type Person struct {
Name string
Age int
// TODO: Вставьте структуру Address здесь (всего одна строка)
}
func main() {
// Создайте нового человека с информацией об адресе
person := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Wonderland",
ZipCode: "12345",
},
}
// Выведите информацию о человеке, включая адрес
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
// TODO: Выведите поля адреса напрямую из экземпляра person
// (без использования person.Address.Street и т. д.)
fmt.Println("Street:", person.Street)
fmt.Println("City:", person.City)
fmt.Println("ZipCode:", person.ZipCode)
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Операторы сравнения и логические операторы
Операторы сравнения — Часть 1Операторы сравнения — Часть 2Логический оператор ANDЛогический оператор ORЛогический оператор NOTОсновы приоритета операторовИтоги: выполнение сравнений7Управляющие конструкции: Циклы
Что такое цикл `for`Цикл `for` — основыЦикл `for` — только условиеКлючевое слово `break`Ключевое слово `continue`Вложенные циклыИтоги — повторение действий2Переменные и базовые типы данных
Что такое переменнаяВывод типов с помощью `:=`Целые числа (int)Числа с плавающей точкойЛогический тип (Booleans)СтрокиНулевые значения (Zero Values)КонстантыПравила именованияИтоги: переменные и типы5Основы ввода-вывода
Форматированный выводСпецификаторы форматаВывод типовБазовый ввод данных пользователемИтоги: ввод и вывод8Функции
Понимание функцийОбъявление функцииВызов функцийПараметры функцииВозврат одного значенияВозврат нескольких значенийИменованные возвращаемые значенияОсновы области видимости функцийИтоги — создание переиспользуемого кода3Базовые операторы
Арифметические операторыОператор деленияОператор остатка от деленияОператор присваиванияКомбинированные операторы присваиванияИнкремент и декрементПовторение — Вычисления6Управление потоком: Условные конструкции
Оператор `if`Ключевое слово `else`Ключевое слово `else if`Затенение переменных в `if`Инициализация переменныхОператор `switch`Switch с выражениямиSwitch без выраженийКлючевое слово `fallthrough`Итоги — Принятие решений