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

Свое имя в 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 есть метод с одним именем.

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