Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpEmSv 22 of 280 menu
◀ ▶

Несколько встроенных в Go

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

Соберем профиль с адресом и контактом:

package main import "fmt" type Address struct { City string } type Contact struct { Email string } type Profile struct { Address Contact Name string } func main() { p := Profile{ Address: Address{City: "oslo"}, Contact: Contact{Email: "ann@mail.example"}, Name: "ann", } fmt.Println(p.City) fmt.Println(p.Email) fmt.Println(p.Name) }

Поля City и Email поднялись без конфликта, потому что имена разные. При одинаковом имени у двух внутренних типов поднятие становится неоднозначным, и в коде используют полный путь через имя типа.

Методы каждого внутреннего типа поднимаются по тем же правилам, если имя метода не занято на внешнем типе и не пересекается с другим поднятым методом.

Даны переменные:

package main import "fmt" type Address struct { City string } type Contact struct { Email string } type Profile struct { Address Contact Name string } p := Profile{ Address: Address{City: "oslo"}, Contact: Contact{Email: "bob@mail.example"}, Name: "bob", }

Выведите поднятые поля города и почты, затем имя.

Объявите Profile с двумя встроенными типами и полем Name, заполните литерал и выведите все три строки короткими именами полей.

Скажите, можно ли читать p.City, если в Profile встроены Address и Contact с разными наборами полей.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить