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