Interfaces

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).