Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Range: iterare su strutture dati

Impariamo ad eseguire iterazioni su strutture dati, sfruttando il costrutto range fornito dal linguaggio Go.
Impariamo ad eseguire iterazioni su strutture dati, sfruttando il costrutto range fornito dal linguaggio Go.
Link copiato negli appunti

Abbiamo visto nel corso della guida diverse strutture dati con cui il linguaggio Go approccia l'immagazzinamento organizzato di informazioni. Tra le varie operazioni che
possiamo esperire su tali oggetti vi è sicuramente quello dell'iterazione ovvero il loro attraversamento finalizzato a ricerche, elaborazioni, stampa o qualsiasi
altra forma di attività. Un elemento del linguaggio che vale la pena conoscere in proposito è il cosiddetto range, un costrutto che mira
appositamente all'iterazione su strutture dati di ogni tipo.

Range e array

Uno dei primi esperimenti che conduciamo sui range vede questi elementi al lavoro su una delle strutture dati più comuni in assoluto, gli array, tipicamente
deputati alla conservazione di sequenze di oggetti.

Creiamo un nuovo array:

nomi:= []string{"Paola", "Jennifer", "Noemi", "Sandro", "Simone"}

L'abbiamo chiamato nomi in quanto conterrà una serie di stringhe che rappresentano nomi di persona. L'abbiamo inizializzato
esplicitamente con i valori che ci interessano ma senza indicarne la capacità. Possiamo sin da subito sperimentare i range utilizzandoli per
eseguire un ciclo su ogni elemento dell'array. Il nostro scopo è avere un ciclo for
che produca la stampa di ogni stringa contenuta:

for _, nome:= range nomi {
        fmt.Println(posizione,") ", nome)
    }

Si noti come abbiamo costruito l'iterazione. Con la parola chiave range abbiamo specificato l'oggetto su cui agire (l'array nomi) ed
il blocco di codice da eseguire su ogni elemento che verrà contenuto nella variabile nome. Ecco l'output ottenuto:

>  Paola
>  Jennifer
>  Noemi
>  Sandro
>  Simone

Come si vede ogni elemento è stato stampato preceduto da un simbolo di maggiore (>) che abbiamo usato come semplice indicatore dell'elenco. Tutti
gli elementi dell'array sono stati emessi in output a dimostrazione che il costrutto range permette un'esplorazione completa della struttura dati.
Si noti che dopo il for è stato introdotto un simbolo di underscore (_). Ciò perchè range offrirebbe anche un indice progressivo in grado di mostrare la posizione dell'elemento che
la singola iterazione sta trattando. In questo caso non ci interessava questo dato ma se volessimo utilizzarlo potremmo definire un'ulteriore variabile:

for posizione, nome:= range nomi {
        fmt.Println(posizione,") ", nome)
    }

In tal caso, otterremmo i vari nomi, ognuno introdotto dalla sua posizione nell'array:

0 )  Paola
1 )  Jennifer
2 )  Noemi
3 )  Sandro
4 )  Simone

Range e mappe

Per dimostrare l'utilità di range anche con le mappe possiamo sfruttare di nuovo l'esempio della pagella visto nella lezione precedente:

pagella := make(map[string]int)
pagella["Italiano"] = 7
pagella["Storia"] = 8
pagella["Geografia"] = 6
pagella["Matematica"] = 5
pagella["Fisica"] = 6

Sappiamo che le mappe vengono tipicamente impiegate per l'accesso istantaneo ad un singolo elemento eppure una loro iterazione elemento per elemento potrebbe comunque
essere utile come nel seguente caso:

for materia, voto := range pagella {
        fmt.Printf("%s: %d\n", materia, voto)
    }

ottenendo in risposta quanto segue:

Geografia: 6
Matematica: 5
Fisica: 6
Italiano: 7
Storia: 8

L'output non ha mantenuto l'ordine di inserimento ma ciò non stupisce sapendo che le mappe per lo più si occupano di ottimizzare l'immagazzinamento
dei dati ma per fare ciò non conservano le informazioni relative alle posizioni degli elementi. Anche in questo caso abbiamo utilizzato due variabili per gestire
ogni iterazione (materia e voto): con la prima abbiamo via via avuto a disposizione la chiave ovvero il nome della materia,
con la seconda il valore, vale a dire il voto conseguito.

Potremmo ottenere anche un elenco delle sole chiavi:

for materia:= range pagella {
        fmt.Printf("%s\n", materia)
    }

ottenendo:

Italiano
Storia
Geografia
Matematica
Fisica

oppure dei soli valori:

for _, voto:= range pagella {
        fmt.Println(voto)
    }

che produrrebbe:

7
8
6
5
6

A proposito di questi due esempi si notino un paio di aspetti. L'uso dell'underscore è stato richiesto solo nel secondo in quanto se definiamo
una sola variabile di iterazione, Go darà per scontato che si tratti della chiave. Al momento di richiedere il voto, abbiamo invece usato l'underscore.
Inoltre, si noti che i voti non sono stati prodotti nell'ordine di inserimento mentre le chiavi sì. Ciò dipende dal modo in cui l'elaborazione di una struttura dati
viene affrontata da Go sfruttando approcci diversi a seconda dei casi.


Ti consigliamo anche