Aggiungere elementi a un insieme
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 33 di 68.
Ora che hai creato un insieme, il passo successivo è imparare ad aggiungervi elementi. Poiché un insieme in Go è in realtà una mappa sottostante, aggiungere un elemento a un insieme equivale ad aggiungere una chiave a una mappa.
Per aggiungere un elemento al tuo set, assegni semplicemente il valore struct vuoto a una nuova chiave:
colors["yellow"] = struct{}{}La sintassi struct{}{} crea un valore letterale di struct vuoto. Il primo struct{} specifica il tipo e il secondo {} lo inizializza. Questo è il modo standard per aggiungere elementi a un insieme in Go.
Il vantaggio di questo approccio è che, se provi ad aggiungere di nuovo lo stesso elemento, la voce esistente viene semplicemente sovrascritta, mantenendo la proprietà di unicità dell’insieme.
Nota che struct{}{} è l’unica sintassi valida per questa assegnazione: scrivere solo {} senza il nome del tipo causa un errore di compilazione: tipo mancante nel literal composito. Il tipo deve essere sempre specificato esplicitamente quando si assegna un valore a una chiave di mappa al di fuori di un literal di mappa.
Aggiungere elementi a un set è veloce e semplice: sfrutta l’implementazione efficiente delle mappe di Go e offre il comportamento tipico dei set per tenere traccia degli elementi univoci.
Sfida
FacileCrea un sistema per tenere traccia delle competenze che gestisca le capacità tecniche di uno sviluppatore usando l’idioma dei set di Go. Questa sfida mostra come aggiungere nuove competenze a un set evitando i duplicati e tenendo traccia dei progressi di apprendimento.
Riceverai due input:
- Una stringa che rappresenta il numero previsto di competenze (ad es.
"5"): serve solo come riferimento - Una stringa contenente competenze separate da virgole (ad es.
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Il tuo compito è:
- Creare un set usando l’idioma di Go
map[string]struct{}per memorizzare competenze tecniche uniche - Inizializzare il set con tre competenze iniziali:
"Programming","Problem Solving"e"Communication" - Analizzare la stringa di input dividendola in corrispondenza delle virgole per ottenere i singoli nomi delle competenze
- Elaborare tutte le competenze della stringa separate da virgole (scorrere l’intera slice, senza usare il parametro count)
- Per ogni competenza ricevuta in input, aggiungerla al set usando
struct{}{}come valore - Mostrare i risultati dell’elaborazione stampando ogni competenza man mano che viene elaborata:
- Se la competenza è nuova per il set:
"Learning new skill: [skill]" - Se la competenza è già presente nel set:
"Already mastered: [skill]"
- Se la competenza è nuova per il set:
- Dopo aver elaborato tutte le competenze, mostrare un riepilogo dei progressi:
"Skills processed: [total_processed]"- usare la lunghezza della slice delle competenze"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Infine, elencare tutte le competenze nel set di competenze dello sviluppatore:
- Intestazione:
"Complete skill set:" - Ogni competenza su una riga separata:
"✓ [skill]"
- Intestazione:
Importante: Usa range per scorrere tutte le competenze nella slice, non il parametro count. Il conteggio viene fornito come riferimento, ma non deve determinare il ciclo. Usa il pacchetto strings per dividere la stringa di input. Per verificare se una competenza esiste già prima di aggiungerla, usa l’idioma comma ok: _, exists := skillSet[skill]. Questa sfida mostra come l’aggiunta di elementi a un set di Go gestisca automaticamente l’unicità, offrendo al contempo prestazioni di ricerca rapide per verificare l’appartenenza.
Provalo tu
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Leggi l'input
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// Converti la stringa del conteggio in un intero (solo come riferimento, non viene usato nel ciclo)
_, _ = strconv.Atoi(countStr)
// Inizializza l'insieme delle competenze con quelle di partenza
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// Suddividi la stringa delle competenze in competenze separate
skills := strings.Split(skillsStr, ",")
// TODO: Scrivi il tuo codice qui sotto
// Elabora ogni competenza usando range per iterare su TUTTE le competenze nella slice
// Usa l'idioma comma ok: _, exists := skillSet[skill]
// Aggiungi nuove competenze usando: skillSet[skill] = struct{}{}
// Mostra i risultati dell'elaborazione per ogni competenza
// Calcola e mostra un riepilogo dei progressi usando len(skills)
// Elenca tutte le competenze nell'insieme completo (valuta di ordinarle per ottenere un output coerente)
}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