Sobes.tech
Junior — Middle

Jak kompilator określa, którą konkretną metodę wywołać przy przeciążeniu lub nadpisaniu?

sobes.tech AI

Odpowiedź od AI

W Go nie ma przeciążania metod w klasycznym sensie, jak w C++ czy Java. Każda metoda lub funkcja ma unikalną nazwę w pakiecie. Jeśli istnieje kilka funkcji o tej samej nazwie, ale różnych parametrach, spowoduje to błąd kompilacji.

Jeśli chodzi o nadpisywanie, Go używa interfejsów: jeśli typ implementuje metody interfejsu, to podczas wywołania przez interfejs zostanie wywołana metoda konkretnego typu.

W ten sposób wybór metody odbywa się podczas kompilacji na podstawie nazwy i sygnatury funkcji, a wywołanie dynamiczne przez interfejs jest określane na podstawie typu obiektu w czasie wykonywania.

Przykład:

package main
import "fmt"

type Speaker interface {
    Speak()
}

type Dog struct{}
func (d Dog) Speak() { fmt.Println("Woof") }

type Cat struct{}
func (c Cat) Speak() { fmt.Println("Meow") }

func main() {
    var s Speaker
    s = Dog{}
    s.Speak() // Wypisze Woof
    s = Cat{}
    s.Speak() // Wypisze Meow
}