Fácil Go
Implementando uma interface pequena
Enunciado
Crie uma interface Saudacao com o método Ola() string. Defina um tipo Pessoa com campo Nome e implemente Ola() retornando "Olá, <Nome>!". No main, crie uma Pessoa e chame Ola() diretamente e via interface.
Requisitos
- Definir a interface
Saudacaocom o métodoOla() string. - Definir o tipo
Pessoacom campoNome string. - Implementar
Ola()no tipoPessoa(receiver de valor). - No
main, chamarOla()diretamente e através de uma variável do tipoSaudacao.
Código inicial
package main
import "fmt"
// Defina a interface Saudacao
// Defina o tipo Pessoa
// Implemente Ola()
func main() {
// Crie uma Pessoa e chame Ola()
}
Saída esperada
Olá, Maria!
Olá, Maria!
Ver dica
Lembre-se: a interface só precisa declarar o método. O tipo Pessoa a satisfaz automaticamente ao implementar Ola().
Mostrar solução
package main
import "fmt"
// Interface pequena com um único método
type Saudacao interface {
Ola() string
}
// Tipo concreto
type Pessoa struct {
Nome string
}
// Implementação implícita: basta ter o método Ola()
func (p Pessoa) Ola() string {
return "Olá, " + p.Nome + "!"
}
func main() {
p := Pessoa{Nome: "Maria"}
// Chamada direta
fmt.Println(p.Ola())
// Chamada via interface
var s Saudacao = p
fmt.Println(s.Ola())
}
Passo a passo
- Declaramos a interface
Saudacaocom o métodoOla() string. Interfaces em Go listam apenas assinaturas de métodos. - Definimos a struct
Pessoacom o campoNome. - Implementamos
Ola()com receiver de valor (p Pessoa). Isso fazPessoasatisfazerSaudacaoautomaticamente. - No
main, criamosp := Pessoa{"Maria"}e chamamosp.Ola()diretamente. - Atribuímos
pa uma variável do tipoSaudacao. ComoPessoaimplementaOla(), a atribuição é válida. - Chamamos
s.Ola(), que executa o método dePessoadinamicamente.
Por que funciona
A satisfação é implícita: não escrevemos implements Saudacao. O compilador verifica se o tipo tem todos os métodos da interface. Como Pessoa tem Ola() string, ela satisfaz Saudacao. Isso permite trocar implementações sem alterar o código que usa a interface.
Erros comuns
- Esquecer o receiver:
func Ola() stringnão é método dePessoa. Corrija parafunc (p Pessoa) Ola() string. - Usar receiver de ponteiro e atribuir valor:
func (p *Pessoa) Ola()faz*Pessoasatisfazer a interface, masPessoanão. Se precisar de valor, use&p. - Nome do método diferente:
Ola()eola()são métodos distintos. Go diferencia maiúsculas e minúsculas.
Outra forma de resolver
Usar uma função que aceita a interface:
func cumprimentar(s Saudacao) {
fmt.Println(s.Ola())
}
Isso é útil quando você quer desacoplar a lógica de impressão.
Saída esperada
Olá, Maria!
Olá, Maria!