Interfaces
#
// _Interfaces_ são coleções nomeadas de assinaturas
// de métodos.
package main
import (
"fmt"
"math"
)
// Aqui está uma interface básica para formas geométricas.
type geometria interface {
area() float64
perimetro() float64
}
// Para o exemplo, será implementado esta interface nos
// tipos `retangulo` e `circulo`.
type retangulo struct {
largura, altura float64
}
type circulo struct {
raio float64
}
// Para implementar uma interface em Go, apenas é necessário
// implementar a uma struct todos os métodos constantes numa
// interface. Aqui é implementada a interface `geometria` em `retangulo`.
func (r retangulo) area() float64 {
return r.largura * r.altura
}
func (r retangulo) perimetro() float64 {
return 2*r.largura + 2*r.altura
}
// E aqui, a implementação em `circulo`.
func (c circulo) area() float64 {
return math.Pi * c.raio * c.raio
}
func (c circulo) perimetro() float64 {
return 2 * math.Pi * c.raio
}
// Se uma variável tem um tipo interface, então é possível
// chamar os métodos constantes daquela interface.
// Aqui uma função genérica `medir`, usando este conceito
// para funcionar com qualquer struct que implemente a
// interface `geometria`.
func medir(g geometria) {
fmt.Println(g)
fmt.Println(g.area())
fmt.Println(g.perimetro())
}
func main() {
r := retangulo{largura: 3, altura: 4}
c := circulo{raio: 5}
// Ambas as structs `circulo` e `retangulo` implementam
// a interface `geometria`, então é possível utilizar
// instâncias destas structs como argumentos para a função
// `medir`.
medir(r)
medir(c)
}
$ go run interfaces.go
{3 4}
12
14
{5}
78.53981633974483
31.41592653589793
# Para aprender mais sobre Interfaces em Go, veja
# este [post](https://jordanorelli.tumblr.com/post/32665860244/how-to-use-interfaces-in-go).