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
FormacomArea() float64. - Definir
RetanguloeCirculoe implementarArea()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
- Definimos a interface
Formacom o métodoArea() float64. Interfaces pequenas são preferíveis. - Criamos a struct
RetangulocomLarguraeAltura. - Implementamos
Area()paraRetangulomultiplicando os campos. - Criamos
CirculocomRaioe implementamosArea()usandomath.Pi. - A função
somaAreasrecebe[]Forma. ComoRetanguloeCirculosatisfazemForma, podemos colocá-los na slice. - No
main, criamos a slice com as duas formas, chamamossomaArease 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 satisfazForma. - Usar receiver de ponteiro e passar valor: se
Area()for definida em*Retangulo, entãoRetangulonão satisfazForma; use&Retangulo{...}. - Importar
mathe não usar: erro de compilação. Usemath.Picorretamente. - Formatar com
%fem 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