Se quiser copiar o código do PIX:

00020126580014BR.GOV.BCB.PIX013643c5f950-535b-4658-b91f-1f1d135fe4105204000053039865802BR5925Antonio Cavalcante de Pau6009SAO PAULO61080540900062070503***6304946B

Aula 21 - Tutorial Golang - Interface

Interface

Uma interface é uma estrutura/sintaxe de programação que permite ao programador impor certas propriedades em um objeto (classe). São coleções nomeadas de assinaturas de métodos. O código abaixo é uma interface básica para formas geométricas, onde declaramos que ela irá ter dois métodos, o que calcula a área e o que calcula o perímetro, e isso independe da geometria, podendo ser um retângulo ou um círculo, no caso do exemplo mostrado.

type geometry interface {
  area() float64
  perim() float64
}
Para esse exemplo, implementaremos essa interface com os tipos rect e circle.

type rect struct {
  width, height float64
}
type circle struct {
  radius float64
}
Para implementar uma interface em Go, basta implementar todos os métodos da interface.

Métodos do Retângulo

Aqui a implementação dos métodos que calcula a área e o que calcula o perímetro de um retângulo, ou seja, faz o cálculo da geometria.

func (r rect) area() float64 {
  return r.width * r.height
}
func (r rect) perim() float64 {
  return 2 * r.width + 2 * r.height

Métodos do Círculo

Aqui a implementação dos métodos que calcula a área e o que calcula o perímetro de um círculo.

func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
    return 2 * math.Pi * c.radius
}

Chamando métodos da interface

Se uma variável tiver um tipo de interface, podemos chamar métodos que estão na interface nomeada. Aqui está uma função de medida genérica aproveitando isso para trabalhar em qualquer geometria.

func measure(g geometry) {
  fmt.Println(g)
  fmt.Println("Área: ", g.area())
  fmt.Println("Perímetro: ", g.perim())
}
Os tipos de estrutura circle e rect implementam a interface geometry para que possamos usar instâncias dessas estruturas como argumentos para medir.

func main() {
  r := rect{width: 3, height: 4}
  c := circle{radius: 5}
  fmt.Print("Medidas do retângulo(largura e altura): ")
  measure(r)
  fmt.Print("Medida do círculo(raio): ")
  measure(c)
}

Código completo


package main

import (
 "fmt"
 "math"
)

type geometry interface {
  area() float64
  perim() float64
}

type rect struct {
  width, height float64
}
type circle struct {
 radius float64
}

func (r rect) area() float64 {
  return r.width * r.height
}
func (r rect) perim() float64 {
  return 2*r.width + 2*r.height
}

func (c circle) area() float64 {
  return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
  return 2 * math.Pi * c.radius
}

func measure(g geometry) {
  fmt.Println(g)
  fmt.Println("Área: ", g.area())
  fmt.Println("Perímetro: ", g.perim())
}

func main() {
  r := rect{width: 3, height: 4}
  c := circle{radius: 5}
  fmt.Print("Medidas do retângulo(largura e altura): ")
  measure(r)
  fmt.Print("Medida do círculo(raio): ")
  measure(c)
}

E pra executar é só entrar na pasta onde tá o arquivo interfaces.go


go run interfaces.go

Saída:

Medidas do retângulo(largura e altura): {3 4} Área: 12 Perímetro: 14 Medida do círculo(raio): {5} Área: 78.53981633974483 Perímetro: 31.41592653589793

É isso pessoal, fico por aqui, na próxima a gente vai ver embedding.

Até mais. :)

Página principal do blog

página do Código Fluente no Facebook

Esse é o link do código fluente no Pinterest

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado e bons estudos. ;)