Sobes.tech
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
}