Go Em Exemplos: 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.

Próximo exemplo: Struct Embedding.