Как в Go вызвать метод встроенной структуры, если он был переопределен?

Ответ

В 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.