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

Robô de aeroporto

Exercício de aprendizagem

Introdução

Interface como um conjunto de métodos

Na sua forma mais simples, um tipo de interface é um conjunto de assinaturas de métodos. Aqui está um exemplo de 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 costumam aumentar a legibilidade.

Nomes de interface em Go não contêm a palavra Interface ou I. Em vez disso, muitas vezes terminam com er, por exemplo Reader, Stringer.

Implementando uma interface

Qualquer tipo que define os métodos da interface a implementa automaticamente e de forma implícita. Não existe a palavra-chave implements em Go.

O tipo a seguir 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 receptor de valor ou de ponteiro. (Reveja os conceitos de métodos caso tenha dúvidas sobre eles.)

Um valor de tipo de interface pode conter qualquer valor que implemente esses métodos. [^1]

Isso significa que Stats agora pode ser usado em todos os lugares que esperam a interface Counter.

func SetUpAnalytics(counter Counter) {
    // ...
}

stats := Stats{}
SetUpAnalytics(stats)
// works because Stats implements Counter

Como as interfaces são implementadas de forma implícita, um tipo pode facilmente implementar várias interfaces. Ele só precisa ter todos os métodos necessários definidos.

Interface vazia

Existe um tipo de interface muito especial em Go, o tipo interface vazia, que contém zero métodos. A interface vazia é escrita assim: interface{}. any é um alias para interface{}, e é usado com mais frequência.

Como a interface vazia não tem métodos, todo tipo a implementa implicitamente. Isso é ú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 interface vazia.

Instruções

O novo aeroporto de Berlim contratou desenvolvedores para o laboratório de robôs deles, e você está começando a trabalhar lá. Eles têm robôs desajeitados, meio humanoides, que estão tentando usar para melhorar o atendimento ao cliente.

Sua primeira tarefa no trabalho é escrever um programa para que o robô possa cumprimentar as pessoas no idioma nativo delas depois que elas escanearem os passaportes no balcão de autoatendimento.

O robô tem orgulho de suas habilidades, então ele sempre vai dizer primeiro qual idioma ele sabe falar e depois cumprimentar a pessoa. Por exemplo, se alguém escanear um passaporte alemão, o robô diria:

I can speak German: Hallo Dietrich!

1. Crie a funcionalidade abstrata de saudação

Você não vai escrever o código dos diferentes idiomas, então precisa estruturar o código do robô de forma que outros desenvolvedores possam adicionar mais idiomas facilmente depois.

Como primeiro passo, defina uma interface Greeter com dois métodos.

  • LanguageName, que retorna o nome do idioma (uma string) no qual o robô deve cumprimentar o visitante.
  • Greet, que aceita o nome de um visitante (uma string) e retorna uma string com a mensagem de saudação em um idioma específico.

Em seguida, implemente uma função SayHello que aceita o nome do visitante e qualquer coisa que implemente a interface Greeter como argumentos e retorna a string de saudação desejada. Por exemplo, imagine uma implementação alemã de Greeter em que LanguageName retorna "German" e Greet retorna "Hallo {name}!":

SayHello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"

2. Implemente o italiano

Agora sua tarefa é fazer o robô funcionar para as pessoas que escaneiam passaportes italianos.

Para isso, crie uma struct Italian e implemente os dois métodos necessários para que a struct cumpra a interface Greeter que você definiu na tarefa 1. Você pode cumprimentar alguém em italiano com "Ciao {name}!".

3. Implemente o português

Antes de encerrar o expediente, você também deve terminar a funcionalidade de cumprimentar as pessoas em português.

Para isso, crie uma struct Portuguese e implemente os dois métodos necessários para que a struct cumpra a interface Greeter aqui também. Você pode cumprimentar alguém em português com "Olá {name}!".

Editar via GitHub O link abre em uma nova janela ou aba
Go Exercism

Tudo pronto para começar Robô de aeroporto?

Crie sua conta no Exercism para aprender e dominar Go com 34 conceitos166 exercícios e mentoria humana de verdade, tudo de graça.