Maps de Structs
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 26 sur 68.
Les maps deviennent incroyablement puissantes lorsque vous stockez des structs en tant que valeurs. Ce modèle vous permet d'organiser des données complexes et structurées en utilisant des clés significatives pour une recherche et une récupération faciles.
Lorsque vous utilisez des structures comme valeurs de map, vous créez essentiellement une collection où chaque clé pointe vers un enregistrement de données complet. Voici comment déclarer et initialiser une telle map :
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Vous pouvez accéder aux données de la structure et les manipuler via la map, comme pour n'importe quelle autre opération sur une map. Pour obtenir les informations d'un étudiant, il vous suffit d'utiliser son nom comme clé :
alice := students["Alice"]
fmt.Println(alice.ID) // affiche : 101
fmt.Println(alice.Grade) // affiche : ACe modèle est extrêmement courant dans les applications Go pour stocker des collections de données liées, telles que des profils d'utilisateurs, des catalogues de produits ou des paramètres de configuration où vous avez besoin à la fois de données structurées et d'un accès rapide basé sur des clés.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileCréez un système de gestion des notes des étudiants en utilisant des maps avec des structs comme valeurs. Ce défi démontre comment organiser des données d'étudiants complexes en utilisant des clés significatives pour une recherche et une récupération efficaces.
Vous recevrez deux entrées :
- Une chaîne représentant le nombre d'étudiants (par exemple,
"4") - Une chaîne contenant les données des étudiants au format :
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(par exemple,"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
Votre tâche consiste à :
- Définir une struct
Studentavec les champs suivants :ID(int) - le numéro d'identification de l'étudiantGrade(string) - la note alphabétique de l'étudiant
- Créer une map où les clés sont les noms des étudiants (strings) et les valeurs sont des structs
Student - Analyser les données des étudiants à partir de la deuxième entrée :
- Diviser l'entrée par des virgules pour obtenir les entrées individuelles des étudiants
- Pour chaque entrée, diviser par des deux-points pour séparer le nom, l'ID et la note
- Convertir la chaîne ID en un entier
- Créer une struct
Studentet l'ajouter à la map avec le nom comme clé
- Afficher tous les étudiants par ordre alphabétique de nom au format :
"[name]: ID [id], Grade [grade]" - Calculer et afficher les statistiques de notes :
- Compter combien d'étudiants ont chaque note (A, B, C, D, F)
- Afficher le compte pour chaque note qui apparaît au format :
"Grade [grade]: [count] students" - Afficher les notes par ordre alphabétique (A, B, C, D, F)
- Trouver et afficher l'étudiant avec l'ID le plus élevé au format :
"Highest ID: [name] ([id])" - Afficher le nombre total d'étudiants :
"Total students: [count]"
Utilisez le package strconv pour convertir la chaîne ID en un entier, et le package sort pour trier les noms des étudiants par ordre alphabétique. Ce défi démontre comment les maps avec des valeurs de type struct offrent un moyen efficace d'organiser et d'accéder à des collections de données complexes en utilisant des identifiants significatifs.
Aide-mémoire
Les maps peuvent stocker des structures en tant que valeurs, créant ainsi des collections où chaque clé pointe vers un enregistrement de données complet :
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Accédez aux données de la structure via la map en utilisant la clé :
alice := students["Alice"]
fmt.Println(alice.ID) // affiche : 101
fmt.Println(alice.Grade) // affiche : ACe modèle est couramment utilisé pour stocker des collections de données liées, telles que des profils d'utilisateurs, des catalogues de produits ou des paramètres de configuration, lorsque vous avez besoin à la fois de données structurées et d'un accès rapide basé sur des clés.
Essayez vous-même
package main
import (
"fmt"
)
func main() {
// Lire l'entrée
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO : Définir la structure Student ici
// TODO : Créer une map pour stocker les étudiants (nom comme clé, structure Student comme valeur)
// TODO : Analyser les données des étudiants et remplir la map
// TODO : Afficher tous les étudiants par ordre alphabétique de nom
// TODO : Calculer et afficher les statistiques de notes
// TODO : Trouver et afficher l'étudiant avec l'ID le plus élevé
// TODO : Afficher le nombre total d'étudiants
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements