Récapitulatif - Collection générique
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy. Leçon 72 sur 107.
Défi
FacileConstruisons une structure de données générique Queue qui démontre tout ce que vous avez appris sur les génériques en Go ! Contrairement à une pile (LIFO), une file suit un ordre First-In-First-Out (FIFO) : le premier élément ajouté est le premier à être retiré.
Vous organiserez votre code sur deux fichiers :
queue.go: définissez votre collection de file générique.Créez une structure générique
Queue[T any]qui stocke les éléments en interne. Votre file doit prendre en charge les opérations suivantes :Enqueue(item T)- ajoute un élément à la fin de la fileDequeue() (T, bool)- retire et renvoie l’élément au début de la file, ainsi qu’un booléen indiquant la réussite (renvoie la valeur nulle etfalsesi la file est vide)Peek() (T, bool)- renvoie l’élément au début sans le retirer (même modèle de retour que Dequeue)Size() int- renvoie le nombre d’éléments dans la fileIsEmpty() bool- renvoie true si la file ne contient aucun élément
Créez également une fonction constructeur
NewQueue[T any]() *Queue[T]qui renvoie un pointeur vers une file vide initialisée.main.go: démontrez le fonctionnement de votre file avec différents types en fonction de l’entrée.Lisez un indicateur de type (
intoustring), puis lisez une série de commandes à exécuter sur la file. Chaque commande se trouve sur sa propre ligne :enqueue [value]- ajoute la valeur à la filedequeue- retire et affiche l’élément au début (affichezemptysi la file est vide)peek- affiche l’élément au début sans le retirer (affichezemptysi la file est vide)size- affiche la taille actuelle
Lisez les commandes jusqu’à recevoir
done.
Les entrées suivantes seront fournies :
- Ligne 1 : indicateur de type (
intoustring) - Lignes suivantes : commandes jusqu’à
done
Par exemple, avec :
int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
doneVotre sortie doit être :
10
10
2
20
30
emptyEt avec :
string
enqueue hello
enqueue world
size
peek
dequeue
peek
doneVotre sortie doit être :
2
hello
hello
worldVotre file doit fonctionner de manière identique pour les types entier et chaîne de caractères, démontrant comment une seule implémentation générique gère plusieurs types concrets tout en conservant une sécurité de typage complète.
Essayez vous-même
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Lire l'indicateur de type
scanner.Scan()
typeIndicator := scanner.Text()
if typeIndicator == "int" {
// TODO: Créer une file d'attente d'entiers en utilisant NewQueue[int]()
// Traiter les commandes pour la file d'attente d'entiers
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Gérer les commandes : enqueue, dequeue, peek, size
// Pour enqueue, analyser la valeur entière depuis parts[1]
// Pour dequeue/peek, afficher "empty" si la file d'attente est vide
_ = command
}
} else if typeIndicator == "string" {
// TODO: Créer une file d'attente de chaînes en utilisant NewQueue[string]()
// Traiter les commandes pour la file d'attente de chaînes
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Gérer les commandes : enqueue, dequeue, peek, size
// Pour enqueue, utiliser la valeur de chaîne depuis parts[1]
// Pour dequeue/peek, afficher "empty" si la file d'attente est vide
_ = command
}
}
// Ceux-ci sont ici pour éviter les erreurs d'import non utilisé pendant le développement
_ = strconv.Atoi
_ = fmt.Println
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO en Go
Fichiers externesEspace de travail et modules GoPackages et importsNoms exportés et non exportésIntroduction à la POO en GoStructs comme classesDéfinir des méthodes sur des structsRécepteurs pointeurs ou par valeurInitialisation des structsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL’interface comme contratInterface vide (any)Assertion de typeCommutation de typeComposition d’interfacesInterfaces Stringer et ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter et SetterDissimulation de l’information en GoRécapitulatif – Fiches d’étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesSolution de contournement pour les méthodes génériquesRécapitulatif - Collection générique2Plongée approfondie dans les types et les structs
Types de base et compositesDéfinitions de types personnalisésTags de structStructs anonymesStructs imbriquésValeurs zéro et valeurs par défautRécapitulatif - Carnet de contacts5La composition plutôt que l’héritage
Pourquoi Go n’a pas d’héritageBases de l’inclusion de structsPromotion des méthodesInclure plusieurs structsInclusion ou agrégationMasquage des méthodes inclusesRécapitulatif : hiérarchie des employés8Gestion des erreurs et POO
L’interface errorTypes d’erreurs personnalisésEnrobage des erreurs (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - Analyseur de fichiers11Bibliothèque standard et POO
io.Reader et io.Writersort.InterfaceInterface fmt.Stringerencoding/json avec des structsInterface http.HandlerRécapitulatif - Modèles d’API REST14Modèles de conception – Partie 2
Modèle CommandeModèle AdaptateurModèle DécorateurModèle Méthode modèleModèle ÉtatModèle CompositeMiddleware comme décorateur3Pointeurs et mémoire
Notions de base des pointeurs en GoPointeurs vers des structuresPassage par valeur ou par référenceLa fonction new()Garbage collection en GoRécapitulatif - Constructeur de listes chaînées6Polymorphisme en Go
Polymorphisme via les interfacesDuck typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif – Processeur de paiements9Concurrence et POO
Bases des GoroutinesCanaux et communicationCanaux tamponnés ou non tamponnésInstruction selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures thread-safeRécapitulatif - Pool de workersEntraînez-vous par vous-même : Compilateur Go en ligne