Sobes.tech
Junior — Middle

Jak určuje překladač, kterou konkrétní metodu volat při přetížení nebo přepsání?

sobes.tech AI

Odpověď od AI

V jazyce Go neexistuje přetížení metod v klasickém smyslu, jako v C++ nebo Java. Každá metoda nebo funkce má v balíčku jedinečný název. Pokud existuje několik funkcí se stejným názvem, ale různými parametry, způsobí to chybu při kompilaci.

Co se týče přepsání, Go používá rozhraní: pokud typ implementuje metody rozhraní, při volání přes rozhraní bude volána metoda konkrétního typu.

Tím pádem, výběr metody se děje při kompilaci na základě názvu a podpisu funkce, a dynamické volání přes rozhraní je určeno typem objektu za běhu.

Příklad:

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() // Vypíše Woof
    s = Cat{}
    s.Speak() // Vypíše Meow
}