Menu
Coddy logo textTech

Вложенные структуры

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 16 из 107.

Вложенная структура — это структура, которая содержит другую именованную структуру в качестве одного из своих полей. Это позволяет моделировать сложные иерархические данные путем объединения более мелких и переиспользуемых типов вместе.

type Address struct {
    Street string
    City   string
    ZIP    string
}

type Person struct {
    Name    string
    Age     int
    Address Address  // вложенная структура
}

Для доступа к полям во вложенной структуре вы соединяете имена полей через точку.

p := Person{
    Name: "Alice",
    Age:  30,
    Address: Address{
        Street: "123 Main St",
        City:   "Boston",
        ZIP:    "02101",
    },
}

fmt.Println(p.Address.City) // Boston

Вложенность способствует повторному использованию кода. Тип Address может использоваться в нескольких структурах, таких как Person, Company или Order, без дублирования полей. Этот подход отражает отношения в реальном мире, где сущности содержат другие сущности.

type Company struct {
    Name      string
    Employees int
    Address   Address  // используется тот же тип Address
}

Вы можете вкладывать структуры на несколько уровней вглубь, хотя сохранение иерархий неглубокими улучшает читаемость. Вложенные структуры являются основополагающими для построения объектно-ориентированных моделей данных в Go.

challenge icon

Задание

Легко

Давайте создадим систему управления сотрудниками, которая демонстрирует, как вложенные структуры помогают моделировать иерархии реального мира. Вы создадите структуру, в которой сотрудники относятся к отделам, а отделы содержат информацию о местоположении.

Вы организуете свой код в двух файлах:

  • models.go: Определите три структуры, которые работают вместе:
    • Location с полями Building (string) и Floor (int)
    • Department с полем Name (string) и вложенным полем Location
    • Employee с полями ID (int), Name (string) и вложенным полем Department
  • main.go: Считайте информацию о сотруднике из входных данных, создайте объект Employee с правильно вложенными структурами и выведите полный профиль сотрудника, обращаясь к полям через вложенную структуру.

Будут предоставлены следующие входные данные:

  • Строка 1: ID сотрудника (целое число)
  • Строка 2: Имя сотрудника
  • Строка 3: Название отдела
  • Строка 4: Название здания
  • Строка 5: Номер этажа (целое число)

Формат вывода:

Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]

Например, для входных данных 101, Alice Chen, Engineering, Tower A и 5, ваш вывод должен быть:

Employee: Alice Chen (ID: 101)
Department: Engineering
Location: Tower A, Floor 5

Обращайтесь к вложенным полям, используя точечную нотацию для перехода по иерархии структур (например, employee.Department.Location.Building).

Шпаргалка

Вложенная структура — это структура, которая содержит другую именованную структуру в качестве одного из своих полей, что позволяет моделировать иерархические данные путем объединения более мелких, переиспользуемых типов.

Определение вложенных структур

type Address struct {
    Street string
    City   string
    ZIP    string
}

type Person struct {
    Name    string
    Age     int
    Address Address  // вложенная структура
}

Доступ к вложенным полям

Используйте точечную нотацию для перемещения по иерархии структур:

p := Person{
    Name: "Alice",
    Age:  30,
    Address: Address{
        Street: "123 Main St",
        City:   "Boston",
        ZIP:    "02101",
    },
}

fmt.Println(p.Address.City) // Boston

Повторное использование вложенных структур

Один и тот же тип вложенной структуры можно повторно использовать в нескольких родительских структурах:

type Company struct {
    Name      string
    Employees int
    Address   Address  // тот же тип Address используется повторно
}

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

Попробуйте сами

package main

import "fmt"

func main() {
	// Чтение информации о сотруднике
	var id int
	var name string
	var deptName string
	var building string
	var floor int

	fmt.Scanln(&id)
	fmt.Scanln(&name)
	fmt.Scanln(&deptName)
	fmt.Scanln(&building)
	fmt.Scanln(&floor)

	// TODO: Создайте Employee с правильно вложенными структурами
	// Используйте структуры Location, Department и Employee из models.go
	// Инициализируйте все вложенные поля входными значениями

	// TODO: Выведите профиль сотрудника, используя формат:
	// Employee: [Name] (ID: [ID])
	// Department: [DepartmentName]
	// Location: [Building], Floor [Floor]
	// Обращайтесь к вложенным полям, используя точечную нотацию (например, employee.Department.Location.Building)
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование