Несколько встроенных в 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 с разными наборами полей.