Junior — Middle
Como é que o compilador determina qual o método específico a chamar em caso de sobrecarga ou substituição?
sobes.tech IA
Resposta da IA
No Go não há sobrecarga de métodos no sentido clássico, como em C++ ou Java. Cada método ou função tem um nome único no pacote. Se houver várias funções com o mesmo nome, mas com parâmetros diferentes, isso causará um erro de compilação.
Quanto à sobrescrição, Go usa interfaces: se um tipo implementa os métodos de uma interface, então ao chamar através da interface, o método do tipo concreto será chamado.
Assim, a escolha do método ocorre em tempo de compilação com base no nome e na assinatura da função, e a chamada dinâmica através da interface é determinada pelo tipo do objeto em tempo de execução.
Exemplo:
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() // Vai imprimir Woof
s = Cat{}
s.Speak() // Vai imprimir Meow
}