Desafio Go

Interface pequena com múltiplas implementações

Enunciado

Defina uma interface Forma com o método Area() float64. Crie dois tipos: Retangulo (campos Largura, Altura) e Circulo (campo Raio). Implemente Area() para ambos. Escreva uma função somaAreas(formas []Forma) float64 que some as áreas. No main, crie uma slice com um retângulo e um círculo, calcule a soma e imprima com duas casas decimais. Use math.Pi para o círculo.

Requisitos

  • Definir a interface Forma com Area() float64.
  • Definir Retangulo e Circulo e implementar Area() em ambos.
  • Implementar somaAreas(formas []Forma) float64.
  • No main, criar uma slice com as duas formas, somar e imprimir com %.2f.

Código inicial

package main

import (
	"fmt"
	"math"
)

// Defina a interface Forma

// Defina Retangulo e Circulo

// Implemente Area() para ambos

// Implemente somaAreas

func main() {
	// Crie as formas, some e imprima
}

Saída esperada

Soma das áreas: 33.14
Ver dica

A área do retângulo é Largura * Altura. A do círculo é math.Pi * Raio * Raio. Use %.2f para formatar.

Mostrar solução
package main

import (
	"fmt"
	"math"
)

// Interface pequena com um método
type Forma interface {
	Area() float64
}

type Retangulo struct {
	Largura, Altura float64
}

// Retangulo implementa Forma
func (r Retangulo) Area() float64 {
	return r.Largura * r.Altura
}

type Circulo struct {
	Raio float64
}

// Circulo implementa Forma
func (c Circulo) Area() float64 {
	return math.Pi * c.Raio * c.Raio
}

// somaAreas aceita qualquer slice de Forma
func somaAreas(formas []Forma) float64 {
	total := 0.0
	for _, f := range formas {
		total += f.Area()
	}
	return total
}

func main() {
	formas := []Forma{
		Retangulo{Largura: 3, Altura: 4},
		Circulo{Raio: 2.5},
	}
	total := somaAreas(formas)
	fmt.Printf("Soma das áreas: %.2f\n", total)
}

Passo a passo

  1. Definimos a interface Forma com o método Area() float64. Interfaces pequenas são preferíveis.
  2. Criamos a struct Retangulo com Largura e Altura.
  3. Implementamos Area() para Retangulo multiplicando os campos.
  4. Criamos Circulo com Raio e implementamos Area() usando math.Pi.
  5. A função somaAreas recebe []Forma. Como Retangulo e Circulo satisfazem Forma, podemos colocá-los na slice.
  6. No main, criamos a slice com as duas formas, chamamos somaAreas e imprimimos com %.2f.

Por que funciona

A interface Forma permite tratar tipos diferentes de maneira uniforme. Cada tipo implementa Area() implicitamente, então a slice []Forma pode conter ambos. A função somaAreas não precisa saber os tipos concretos; ela apenas chama Area(). Isso é polimorfismo em Go.

Erros comuns

  • Esquecer de implementar Area() em um dos tipos: o compilador acusa que o tipo não satisfaz Forma.
  • Usar receiver de ponteiro e passar valor: se Area() for definida em *Retangulo, então Retangulo não satisfaz Forma; use &Retangulo{...}.
  • Importar math e não usar: erro de compilação. Use math.Pi corretamente.
  • Formatar com %f em vez de %.2f: a saída terá muitas casas decimais.

Outra forma de resolver

Você pode calcular a soma diretamente no main com um loop, sem a função somaAreas. A função é preferível para reuso e testes.

Saída esperada

Soma das áreas: 33.14