Para a declaração de uma interface Go, utilizamos a palavra reservada interface como
mostrado abaixo:
Sintaxe
type nome_interface interface {
nome_metodo1(<lista_parametros>) (<tipos_retorno>)
(...)
nome_metodoN(<lista_parametros>) (<tipos_retorno>)
}
Onde
nome_metodo1…N: nome do métodos abstratos
<lista_parametros>: lista de parâmetros separados por (,)
<tipos_retorno>: lista de tipos de retorno separados por (,)
Como a interface é um tipo de dado, podemos criar uma variável do tipo interface e atribuir a
essa variável outras tipos de dados que possuem métodos criados, respeitando as definições
de uma interface. Com o uso de interface, aplicacamos o conceito de abstração.
Exemplo 1
package main
import "fmt"
//declaração dos tipos
type meu_tipo uint8
type meu_tipo2 uint8
//declaração da interface
type minha_interface interface {
MostrarBinario()
}
//implementação da interface e associação de método aos tipos
func (val meu_tipo) MostrarBinario(){
fmt.Printf("MostrarBinario meu_tipo :%08b\n", val)
}
func (val meu_tipo2) MostrarBinario(){
fmt.Printf("MostrarBinario meu_tipo2:%08b\n", val)
}
func main() {
var var_inter minha_interface //nil
var_inter = meu_tipo(100)
var_inter.MostrarBinario()
var_inter = meu_tipo2(200)
var_inter.MostrarBinario()
}
Saída
str1 declared and not used
str2 declared and not used
Ao declarar uma variável do tipo interface sem atribuição inicial, seu
valor padrão ou inicial é nil.
Quando associamos um método a um tipo de dado por meio de interface, todos os métodos
definidos na interface devem ser obrigatóriamente implementados.