Ответ
В Go, чтобы вызвать метод встроенной (embedded) структуры, который был переопределен в основной (внешней) структуре, необходимо обратиться к встроенному полю напрямую по его типу.
Когда вы встраиваете одну структуру в другую, ее методы "продвигаются" (promoted) до уровня внешней структуры. Если внешняя структура определяет метод с таким же именем, он переопределяет продвинутый метод. Для вызова исходного метода используется явное обращение.
Пример:
package main
import "fmt"
// "Родительская" структура
type Human struct {
Name string
}
func (h Human) Greet() {
fmt.Printf("Привет, я человек по имени %sn", h.Name)
}
// Структура со встроенным Human
type Employee struct {
Human // Встраивание по типу
Company string
}
// Переопределение метода Greet
func (e Employee) Greet() {
fmt.Printf("Привет, я сотрудник компании %sn", e.Company)
}
func main() {
employee := Employee{
Human: Human{Name: "Алекс"},
Company: "Google",
}
// Вызов переопределенного метода Employee
employee.Greet() // Вывод: Привет, я сотрудник компании Google
// Явный вызов "родительского" метода Human
employee.Human.Greet() // Вывод: Привет, я человек по имени Алекс
}
Ключевые моменты:
employee.Greet()
вызывает метод, определенный дляEmployee
.employee.Human.Greet()
позволяет получить доступ к методу встроенной структурыHuman
.