Créer un ensemble
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 32 sur 68.
Maintenant que vous comprenez le concept derrière l'idiome set de Go, il est temps de le mettre en pratique en créant votre premier set. Le processus est simple et suit les mêmes schémas que vous avez déjà appris avec les maps.
Pour créer un ensemble (set) en Go, vous déclarez une variable en utilisant le modèle map[T]struct{}, où T est le type d'éléments que vous souhaitez stocker. Voici comment créer un ensemble pour stocker des noms de couleurs uniques :
colors := make(map[string]struct{})Vous pouvez également initialiser un ensemble avec des valeurs de départ en utilisant la syntaxe de littéral de map :
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Remarquez que chaque valeur est un littéral de structure vide {}. Cela crée la valeur zéro de struct{}, qui n'occupe aucun espace mémoire tout en permettant à la clé d'exister dans la map.
La beauté de cette approche est qu'elle exploite l'infrastructure de map existante de Go tout en offrant une véritable sémantique de set - chaque nom de couleur ne peut apparaître qu'une seule fois, et vous obtenez des temps de recherche rapides tout comme avec les maps classiques.
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 suivi de préférences de langages de programmation qui démontre l'idiome des ensembles (sets) en Go pour stocker des éléments uniques. Ce défi montre comment utiliser le modèle map[string]struct{} pour suivre les langages de programmation sans doublons.
Vous recevrez deux entrées :
- Une chaîne de caractères représentant le nombre de langages à traiter (par exemple,
"6") - Une chaîne de caractères contenant des langages de programmation séparés par des virgules (par exemple,
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
Votre tâche consiste à :
- Créer un ensemble en utilisant l'idiome Go
map[string]struct{}pour stocker des langages de programmation uniques - Analyser la chaîne d'entrée en la divisant au niveau des virgules pour obtenir les noms de langages individuels
- Ajouter chaque langage à votre ensemble en utilisant le littéral de structure vide
{}comme valeur - Afficher les résultats du traitement en imprimant chaque langage au fur et à mesure qu'il est rencontré :
- Si le langage est nouveau dans l'ensemble :
"Added: [language]" - Si le langage existe déjà dans l'ensemble :
"Already exists: [language]"
- Si le langage est nouveau dans l'ensemble :
- Après avoir traité tous les langages, afficher un résumé :
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- Enfin, lister tous les langages uniques de l'ensemble :
- En-tête :
"Programming languages in set:" - Chaque langage sur une ligne séparée :
"- [language]"
- En-tête :
Utilisez le package strings pour diviser la chaîne d'entrée et le package strconv pour convertir la chaîne de comptage en entier. Pour vérifier si un langage existe déjà dans l'ensemble avant de l'ajouter, utilisez l'idiome "comma ok" : _, exists := languageSet[language]. Ce défi démontre comment l'idiome des ensembles en Go offre un moyen efficace de suivre des éléments uniques et d'éviter les doublons dans vos données.
Aide-mémoire
Pour créer un ensemble (set) en Go, utilisez le motif map[T]struct{} où T est le type d'élément :
colors := make(map[string]struct{})Vous pouvez également initialiser un ensemble avec des valeurs de départ en utilisant la syntaxe littérale de map :
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Chaque valeur est un littéral de structure vide {} qui crée la valeur zéro de struct{} et n'occupe aucun espace mémoire tout en permettant à la clé d'exister dans la map.
Pour vérifier si un élément existe dans l'ensemble, utilisez l'idiome « comma ok » :
_, exists := languageSet[language]Essayez vous-même
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Lire l'entrée
var countStr string
var languagesStr string
fmt.Scanln(&countStr)
fmt.Scanln(&languagesStr)
// Convertir la chaîne de comptage en entier (non nécessaire pour ce défi)
_, _ = strconv.Atoi(countStr)
// Diviser la chaîne des langues par des virgules
languages := strings.Split(languagesStr, ",")
// Créer un ensemble en utilisant l'idiome map[string]struct{}
languageSet := make(map[string]struct{})
// TODO: Écrivez votre code ci-dessous
// Traiter chaque langue et vérifier si elle existe dans l'ensemble
// Utiliser l'idiome comma ok : _, exists := languageSet[language]
// Afficher "Added: [language]" ou "Already exists: [language]"
// Ajouter les langues à l'ensemble en utilisant un littéral de structure vide {}
// Afficher les informations de résumé
// Afficher le nombre total de langues traitées et le nombre de langues uniques
// Afficher toutes les langues uniques dans l'ensemble
fmt.Println("Programming languages in set:")
// Convertir la map en slice et trier pour un affichage cohérent
// Lister chaque langue avec le format "- [language]"
}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 comportements6Go idiomatique : Les ensembles
L'idiome des ensembles en GoCréer un ensembleAjouter à un ensembleVérifier l'appartenanceSupprimer d'un ensembleItérer sur un ensembleRécapitulatif - Noms d'utilisateur uniques