Menu
Coddy logo textTech

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

Часть раздела Основы путешествия по 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
challenge icon

Задание

Новичок

В этом испытании вы попрактикуетесь в использовании встроенных структур (композиции) в 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)
}
quiz iconПроверьте себя

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

Все уроки раздела Основы