Creare un insieme
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 32 di 68.
Ora che hai compreso il concetto alla base dell’idioma dei set di Go, è il momento di metterlo in pratica creando il tuo primo set. Il procedimento è semplice e segue gli stessi schemi che hai già imparato con le mappe.
Per creare un set in Go, dichiari una variabile usando lo schema map[T]struct{}, dove T è il tipo di elementi che vuoi memorizzare. Ecco come creare un set per memorizzare nomi di colori univoci:
colors := make(map[string]struct{})Puoi anche inizializzare un set con alcuni valori iniziali usando la sintassi dei letterali map:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Nota come ogni valore sia un valore letterale di struct vuoto {}. Questo crea il valore zero di struct{}, che non occupa spazio in memoria pur consentendo alla chiave di esistere nella mappa.
Il bello di questo approccio è che sfrutta l'infrastruttura map già esistente di Go, offrendo al contempo una vera semantica da insieme: ogni nome di colore può comparire una sola volta e la ricerca è veloce, proprio come con le map normali.
Sfida
FacileCrea un tracker delle preferenze per i linguaggi di programmazione che dimostri l'idioma dei set di Go per memorizzare elementi univoci. Questa sfida mostra come usare il pattern map[string]struct{} per tenere traccia dei linguaggi di programmazione senza duplicati.
Riceverai due input:
- Una stringa che rappresenta il numero di linguaggi da elaborare (ad es.,
"6") - Una stringa contenente linguaggi di programmazione separati da virgole (ad es.,
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
Il tuo compito è:
- Creare un set usando l'idioma di Go
map[string]struct{}per memorizzare i linguaggi di programmazione univoci - Analizzare la stringa di input suddividendola in corrispondenza delle virgole per ottenere i singoli nomi dei linguaggi
- Aggiungere ogni linguaggio al set usando il valore di tipo struct vuoto
{} - Mostrare i risultati dell'elaborazione stampando ogni linguaggio quando viene incontrato:
- Se il linguaggio non è ancora presente nel set:
"Added: [language]" - Se il linguaggio è già presente nel set:
"Already exists: [language]"
- Se il linguaggio non è ancora presente nel set:
- Dopo aver elaborato tutti i linguaggi, mostrare un riepilogo:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- Infine, elencare tutti i linguaggi univoci nel set:
- Intestazione:
"Programming languages in set:" - Ogni linguaggio su una riga separata:
"- [language]"
- Intestazione:
Usa il package strings per suddividere la stringa di input e il package strconv per convertire la stringa che rappresenta il conteggio in un intero. Per verificare se un linguaggio è già presente nel set prima di aggiungerlo, usa l'idioma comma ok: _, exists := languageSet[language]. Questa sfida dimostra come l'idioma dei set di Go fornisca un modo efficiente per tenere traccia degli elementi univoci ed evitare duplicati nei dati.
Provalo tu
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Leggi l'input
var countStr string
var languagesStr string
fmt.Scanln(&countStr)
fmt.Scanln(&languagesStr)
// Converti la stringa count in un intero (non necessario per questa sfida)
_, _ = strconv.Atoi(countStr)
// Dividi la stringa delle lingue in base alle virgole
languages := strings.Split(languagesStr, ",")
// Crea un insieme usando l'idioma map[string]struct{}
languageSet := make(map[string]struct{})
// TODO: Scrivi il tuo codice qui sotto
// Elabora ogni lingua e verifica se esiste nell'insieme
// Usa l'idioma comma ok: _, exists := languageSet[language]
// Stampa "Added: [language]" oppure "Already exists: [language]"
// Aggiungi le lingue all'insieme usando il letterale struct vuoto {}
// Stampa le informazioni riepilogative
// Stampa il numero totale di lingue elaborate e il numero di lingue uniche
// Stampa tutte le lingue uniche nell'insieme
fmt.Println("Programming languages in set:")
// Converti la map in una slice e ordinala per ottenere un output coerente
// Elenca ogni lingua nel formato "- [language]"
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamenti6Gli insiemi in Go idiomatico
L'idioma degli insiemi in GoCreare un insiemeAggiungere elementi a un insiemeVerificare l'appartenenzaRimuovere elementi da un insiemeIterare su un insiemeRiepilogo - Nomi utente univociEsercitati da solo: Compilatore Go online