Поднятые поля в Go
Когда структура встроена без имени поля, ее поля поднимаются на уровень внешнего значения. Поле встроенной структуры читают сразу у внешнего значения. Поднятое поле открывают через точку после имени внешней переменной, без имени внутреннего типа посередине.
Создадим пользователя с городом и выведем город короткой и длинной записью:
package main
import "fmt"
type Address struct {
City string
}
type User struct {
Address
Name string
}
func main() {
u := User{
Address: Address{City: "oslo"},
Name: "ann",
}
fmt.Println(u.City)
fmt.Println(u.Address.City)
}
Оба выражения берут одно и то же поле. Запись
u.City и u.Address.City
указывают на город внутри u. Если
изменить город через любой из путей, второй
путь покажет то же значение.
Поднятие касается только имен полей внутреннего типа. Собственные поля внешней структуры читают как раньше, без особых правил.
Даны переменные:
package main
import "fmt"
type Address struct {
City string
}
type User struct {
Address
Name string
}
u := User{
Address: Address{City: "oslo"},
Name: "ann",
}
Выведите город поднятым полем и затем тем же город через встроенный тип.
Дана структура:
package main
import "fmt"
type Address struct {
City string
}
type User struct {
Address
Name string
}
u := User{
Address: Address{City: "berlin"},
Name: "mia",
}
Запишите в поле города новый текст "paris"
через поднятое имя и выведите город через
Address.
Скажите, равны ли значения, прочитанные
как u.City и как u.Address.City,
если u не меняли между чтениями.