Mappe di struct
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 26 di 68.
Le map diventano incredibilmente potenti quando memorizzi le struct come valori. Questo schema ti consente di organizzare dati complessi e strutturati usando chiavi significative per facilitarne la ricerca e il recupero.
Quando usi le struct come valori di una mappa, stai essenzialmente creando una raccolta in cui ogni chiave punta a un record di dati completo. Ecco come dichiarare e inizializzare una mappa di questo tipo:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Puoi accedere ai dati della struct e lavorarci tramite la mappa, proprio come con qualsiasi altra operazione sulle mappe. Per ottenere le informazioni di uno studente, ti basta usare il suo nome come chiave:
alice := students["Alice"]
fmt.Println(alice.ID) // stampa: 101
fmt.Println(alice.Grade) // stampa: AQuesto schema è estremamente comune nelle applicazioni Go per archiviare raccolte di dati correlati, come profili utente, cataloghi di prodotti o impostazioni di configurazione, quando servono sia dati strutturati sia un accesso rapido basato su chiavi.
Sfida
FacileCrea un sistema di gestione dei voti degli studenti usando mappe con struct come valori. Questa sfida mostra come organizzare dati complessi sugli studenti usando chiavi significative per cercarli e recuperarli in modo efficiente.
Riceverai due input:
- Una stringa che rappresenta il numero di studenti (ad es.,
"4") - Una stringa contenente i dati degli studenti nel formato:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(ad es.,"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
Il tuo compito è:
- Definire una struct
Studentcon i seguenti campi:ID(int) - il numero ID dello studenteGrade(string) - il voto in lettere dello studente
- Creare una mappa in cui le chiavi sono i nomi degli studenti (stringhe) e i valori sono struct
Student - Analizzare i dati degli studenti dal secondo input:
- Suddividere l'input usando le virgole per ottenere le singole voci degli studenti
- Per ogni voce, suddividere usando i due punti per separare nome, ID e voto
- Convertire la stringa ID in un intero
- Creare una struct
Studente aggiungerla alla mappa usando il nome come chiave
- Visualizzare tutti gli studenti in ordine alfabetico per nome nel formato:
"[name]: ID [id], Grade [grade]" - Calcolare e visualizzare le statistiche dei voti:
- Contare quanti studenti hanno ciascun voto (A, B, C, D, F)
- Visualizzare il conteggio per ogni voto presente nel formato:
"Grade [grade]: [count] students" - Visualizzare i voti in ordine alfabetico (A, B, C, D, F)
- Trovare e visualizzare lo studente con l'ID più alto nel formato:
"Highest ID: [name] ([id])" - Visualizzare il numero totale di studenti:
"Total students: [count]"
Usa il pacchetto strconv per convertire la stringa ID in un intero e il pacchetto sort per ordinare alfabeticamente i nomi degli studenti. Questa sfida mostra come le mappe con valori struct offrano un modo efficiente per organizzare e accedere a raccolte di dati complessi usando identificatori significativi.
Provalo tu
package main
import (
"fmt"
)
func main() {
// Leggi l'input
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: Definisci qui la struct Student
// TODO: Crea una mappa per memorizzare gli studenti (name come chiave, struct Student come valore)
// TODO: Analizza i dati degli studenti e popola la mappa
// TODO: Mostra tutti gli studenti in ordine alfabetico per nome
// TODO: Calcola e mostra le statistiche sui voti
// TODO: Trova e mostra lo studente con l'ID più alto
// TODO: Mostra il numero totale di studenti
}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 comportamentiEsercitati da solo: Compilatore Go online