Track
/
Go
Go
/
Esercizi
/
Robot dell'aeroporto
Robot dell'aeroporto

Robot dell'aeroporto

Esercizio di apprendimento

Introduzione

L'interfaccia come insieme di metodi

Nella sua forma più semplice, un tipo interfaccia è un insieme di firme di metodi. Ecco un esempio di definizione di interfaccia che include due metodi, Add e Value:

type Counter interface {
    Add(increment int)
    Value() int
}

I nomi dei parametri come increment si possono omettere dalla definizione dell'interfaccia, ma spesso aumentano la leggibilità.

In Go, i nomi delle interfacce non contengono la parola Interface o I. Spesso invece terminano con er, ad esempio Reader o Stringer.

Implementare un'interfaccia

Qualsiasi tipo che definisce i metodi dell'interfaccia la implementa automaticamente, anche se in modo implicito. In Go non esiste la parola chiave implements.

Il tipo seguente implementa l'interfaccia Counter che abbiamo visto sopra.

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

Ai fini dell'implementazione dell'interfaccia, non importa se il metodo ha un receiver di valore o un receiver di puntatore. (Rivedi i concetti sui metodi se hai dei dubbi in merito.)

Un valore di tipo interfaccia può contenere qualsiasi valore che implementi quei metodi. [^1]

Questo significa che ora Stats può essere usato in tutti i punti in cui ci si aspetta l'interfaccia Counter.

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

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

Poiché le interfacce si implementano in modo implicito, un tipo può implementarne facilmente più di una. Gli basta avere definiti tutti i metodi necessari.

L'interfaccia vuota

In Go esiste un tipo interfaccia davvero speciale, il tipo interfaccia vuota, che non contiene alcun metodo. L'interfaccia vuota si scrive così: interface{}. any è un alias di interface{} ed è quello usato più di frequente.

Dato che l'interfaccia vuota non ha metodi, ogni tipo la implementa in modo implicito. Questo è utile per definire una funzione che possa accettare qualsiasi valore in modo generico. In quel caso, il parametro della funzione usa il tipo interfaccia vuota.

Istruzioni

Il nuovo aeroporto di Berlino ha assunto sviluppatori per il suo laboratorio di robot e tu stai iniziando a lavorare lì. Hanno dei robot goffi, dall'aspetto un po' umanoide, che stanno cercando di usare per migliorare il servizio clienti.

Il tuo primo compito è scrivere un programma che permetta al robot di salutare le persone nella loro lingua madre dopo che hanno scansionato il passaporto al banco del self check-in.

Il robot è orgoglioso delle sue capacità, quindi dirà sempre prima quale lingua sa parlare e poi saluterà la persona. Per esempio, se qualcuno scansiona un passaporto tedesco il robot direbbe:

I can speak German: Hallo Dietrich!

1. Crea la funzionalità astratta di saluto

Non scriverai tu stesso il codice per le diverse lingue, quindi devi strutturare il codice del robot in modo che altri sviluppatori possano aggiungere facilmente altre lingue in seguito.

Come primo passo, definisci un'interfaccia Greeter con due metodi.

  • LanguageName, che restituisce il nome della lingua (una string) con cui il robot dovrebbe salutare il visitatore.
  • Greet, che accetta il nome di un visitatore (una string) e restituisce una string con il messaggio di saluto in una lingua specifica.

Poi implementa una funzione SayHello che accetta come argomenti il nome del visitatore e qualsiasi cosa implementi l'interfaccia Greeter, e restituisce la stringa di saluto desiderata. Per esempio, immagina un'implementazione tedesca di Greeter per cui LanguageName restituisce "German" e Greet restituisce "Hallo {name}!":

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

2. Implementa l'italiano

Ora il tuo compito è far funzionare il robot per le persone che scansionano passaporti italiani.

Per farlo, crea una struct Italian e implementa i due metodi necessari perché la struct soddisfi l'interfaccia Greeter che hai definito nell'attività 1. Puoi salutare qualcuno in italiano con "Ciao {name}!".

3. Implementa il portoghese

Prima di concludere la giornata, dovresti anche completare la funzionalità per salutare le persone in portoghese.

Per farlo, crea una struct Portuguese e implementa i due metodi necessari perché la struct soddisfi l'interfaccia Greeter anche qui. Puoi salutare qualcuno in portoghese con "Olá {name}!".

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Go Exercism

Vuoi iniziare Robot dell'aeroporto?

Iscriviti a Exercism per imparare e padroneggiare Go con 34 concetti166 esercizi e il mentoring di persone reali, tutto gratis.