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 Saudacao com o método Ola() string.
  • Definir o tipo Pessoa com campo Nome string.
  • Implementar Ola() no tipo Pessoa (receiver de valor).
  • No main, chamar Ola() diretamente e através de uma variável do tipo Saudacao.

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

  1. Declaramos a interface Saudacao com o método Ola() string. Interfaces em Go listam apenas assinaturas de métodos.
  2. Definimos a struct Pessoa com o campo Nome.
  3. Implementamos Ola() com receiver de valor (p Pessoa). Isso faz Pessoa satisfazer Saudacao automaticamente.
  4. No main, criamos p := Pessoa{"Maria"} e chamamos p.Ola() diretamente.
  5. Atribuímos p a uma variável do tipo Saudacao. Como Pessoa implementa Ola(), a atribuição é válida.
  6. Chamamos s.Ola(), que executa o método de Pessoa dinamicamente.

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() string não é método de Pessoa. Corrija para func (p Pessoa) Ola() string.
  • Usar receiver de ponteiro e atribuir valor: func (p *Pessoa) Ola() faz *Pessoa satisfazer a interface, mas Pessoa não. Se precisar de valor, use &p.
  • Nome do método diferente: Ola() e ola() 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!