Percursos
/
Go
Go
/
Exercícios
/
Robô de aeroporto
Robô de aeroporto

Robô de aeroporto

Exercício de aprendizagem

Introdução

A interface como um conjunto de métodos

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.

Implementar uma interface

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.

Interface vazia

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.

Instruções

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!

1. Cria a funcionalidade abstrata de saudação

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!"

2. Implementa o italiano

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}!".

3. Implementa o português

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}!".

Editar via GitHub A ligação abre numa nova janela ou separador
Go Exercism

Estás pronto para começar Robô de aeroporto?

Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos166 exercícios, e mentoria humana real, tudo grátis.