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
}