Na sua forma mais simples, um tipo de interface é um conjunto de assinaturas de métodos.
Eis um exemplo de uma definição de interface que inclui dois métodos, Add e Value:
type Counter interface {
Add(increment int)
Value() int
}
Os nomes dos parâmetros como increment podem ser omitidos da definição da interface, mas muitas vezes aumentam a legibilidade.
Os nomes de interfaces em Go não contêm a palavra Interface nem I.
Em vez disso, terminam frequentemente em er, por exemplo, Reader, Stringer.
Qualquer tipo que defina os métodos da interface implementa-a automaticamente, de forma implícita.
Não existe a palavra-chave implements em Go.
O tipo seguinte implementa a interface Counter que vimos acima.
type Stats struct {
value int
// ...
}
func (s Stats) Add(v int) {
s.value += v
}
func (s Stats) Value() int {
return s.value
}
func (s Stats) SomeOtherMethod() {
// The type can have additional methods not mentioned in the interface.
}
Para implementar a interface, não importa se o método tem um recetor de valor ou um recetor de ponteiro. (Volta aos conceitos de métodos se tiveres dúvidas sobre isso.)
Um valor do tipo interface pode conter qualquer valor que implemente esses métodos. [^1]
Isso significa que Stats pode agora ser usado em todos os locais que esperam a interface Counter.
func SetUpAnalytics(counter Counter) {
// ...
}
stats := Stats{}
SetUpAnalytics(stats)
// works because Stats implements Counter
Como as interfaces são implementadas implicitamente, um tipo pode implementar facilmente várias interfaces. Só precisa de ter todos os métodos necessários definidos.
Há um tipo de interface muito especial em Go, a interface vazia, que contém zero métodos.
A interface vazia escreve-se assim: interface{}.
any é um alias de interface{} e é o mais utilizado.
Como a interface vazia não tem métodos, qualquer tipo a implementa implicitamente. Isto é útil para definir uma função que pode aceitar qualquer valor de forma genérica. Nesse caso, o parâmetro da função usa o tipo de interface vazia.
O novo aeroporto de Berlim contratou programadores para o seu laboratório de robôs e tu vais começar a trabalhar lá. Têm robôs desajeitados, com um aspeto algo humanoide, que estão a tentar usar para melhorar o atendimento ao cliente.
A tua primeira tarefa é escrever um programa para que o robô consiga cumprimentar as pessoas na sua língua materna depois de estas digitalizarem o passaporte no balcão de check-in automático.
O robô tem orgulho nas suas capacidades, por isso diz sempre primeiro qual é a língua que sabe falar e só depois cumprimenta a pessoa. Por exemplo, se alguém digitalizar um passaporte alemão, o robô diria:
I can speak German: Hallo Dietrich!
Não vais escrever tu o código para as diferentes línguas, por isso tens de estruturar o código do robô de forma a que outros programadores possam acrescentar mais línguas facilmente no futuro.
Como primeiro passo, define uma interface Greeter com dois métodos.
LanguageName, que devolve o nome da língua (uma string) na qual o robô deve cumprimentar o visitante.Greet, que recebe o nome do visitante (uma string) e devolve uma string com a mensagem de saudação numa língua específica.A seguir, implementa uma função SayHello que recebe como argumentos o nome do visitante e qualquer coisa que implemente a interface Greeter, e devolve a string de saudação pretendida.
Por exemplo, imagina uma implementação alemã de Greeter para a qual LanguageName devolve "German" e Greet devolve "Hallo {name}!":
SayHello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Agora a tua tarefa é fazer com que o robô funcione para as pessoas que digitalizam passaportes italianos.
Para isso, cria uma struct Italian e implementa os dois métodos necessários para que a struct cumpra a interface Greeter que definiste na tarefa 1.
Podes cumprimentar alguém em italiano com "Ciao {name}!".
Antes de dares o dia por terminado, também deves acabar a funcionalidade para cumprimentar pessoas em português.
Para isso, cria uma struct Portuguese e implementa os dois métodos necessários para que a struct cumpra também aqui a interface Greeter.
Podes cumprimentar alguém em português com "Olá {name}!".
Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos166 exercícios, e mentoria humana real, tudo grátis.