Menu
Coddy logo textTech

Pointeurs comme valeurs de Map

Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 27 sur 68.

Bien que le stockage de structures directement dans des maps soit utile, le stockage de pointeurs vers des structures débloque une capacité puissante : la possibilité de modifier les données de la structure originale directement via la map. Cette approche est essentielle lorsque vous devez mettre à jour vos données après qu'elles ont été stockées.

Lorsque vous stockez un pointeur vers une structure en tant que valeur de map, vous stockez l'adresse mémoire de la structure, et non une copie de celle-ci. Voici comment déclarer et utiliser une telle map :

type Product struct {
    Price    float64
    Quantity int
}

products := map[string]*Product{
    "laptop": &Product{Price: 999.99, Quantity: 5},
    "mouse":  &Product{Price: 25.50, Quantity: 20},
}

L'avantage clé devient évident lorsque vous devez modifier les données. Puisque vous travaillez avec des pointeurs, les modifications effectuées via la map affectent la structure originale :

// Mettre à jour le prix de l'ordinateur portable directement via la map
products["laptop"].Price = 899.99
fmt.Println(products["laptop"].Price) // affiche : 899.99

Ce modèle est particulièrement précieux dans les applications où vous devez fréquemment mettre à jour des données stockées, telles que des systèmes d'inventaire, des profils d'utilisateurs, ou tout scénario où la map sert de stockage de données principal et où les modifications doivent persister.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

challenge icon

Défi

Facile

Construisez un système simple de gestion d'inventaire qui démontre la puissance de l'utilisation de pointeurs vers des structures comme valeurs de map. Ce défi montre comment les maps basées sur des pointeurs permettent une modification directe des données stockées, rendant votre système d'inventaire efficace et réactif aux mises à jour.

Vous recevrez trois entrées :

  • Une chaîne représentant le nombre de produits (par exemple, "4")
  • Une chaîne contenant les données des produits au format : "name1:price1:quantity1,name2:price2:quantity2,name3:price3:quantity3" (par exemple, "laptop:999.99:5,mouse:25.50:20,keyboard:75.00:15,monitor:299.99:8")
  • Une chaîne contenant les opérations de mise à jour au format : "operation1:product1:value1,operation2:product2:value2" où les opérations sont soit "price" soit "quantity" (par exemple, "price:laptop:899.99,quantity:mouse:25,price:keyboard:65.00")

Votre tâche consiste à :

  1. Définir une structure Product avec les champs suivants :
    • Price (float64) - le prix du produit
    • Quantity (int) - la quantité en stock du produit
  2. Créer une map où les clés sont les noms des produits (chaînes de caractères) et les valeurs sont des pointeurs vers des structures Product
  3. Analyser les données des produits à partir de la deuxième entrée :
    • Diviser l'entrée par des virgules pour obtenir les entrées de produits individuelles
    • Pour chaque entrée, diviser par des deux-points pour séparer le nom, le prix et la quantité
    • Convertir la chaîne de prix en float64 et la chaîne de quantité en entier
    • Créer une structure Product et stocker un pointeur vers celle-ci dans la map
  4. Afficher l'inventaire initial avec l'en-tête "Initial Inventory:"
  5. Afficher chaque produit au format : "[name]: $[price] (Stock: [quantity])"
  6. Analyser et appliquer les opérations de mise à jour à partir de la troisième entrée :
    • Diviser l'entrée par des virgules pour obtenir les opérations individuelles
    • Pour chaque opération, diviser par des deux-points pour obtenir le type d'opération, le nom du produit et la nouvelle valeur
    • Mettre à jour le champ approprié directement via le pointeur de la map
    • Afficher chaque mise à jour au format : "Updated [product]: [field] changed to [new_value]"
  7. Afficher l'inventaire mis à jour avec l'en-tête "Updated Inventory:"
  8. Afficher à nouveau chaque produit dans le même format que l'affichage initial
  9. Calculer et afficher la valeur totale de l'inventaire : "Total Inventory Value: $[total_value]"

Utilisez le package strconv pour convertir les chaînes de prix et de quantité en leurs types numériques respectifs. Formatez tous les prix avec 2 décimales lors de l'affichage. Ce défi démontre comment le stockage de pointeurs dans des maps vous permet de modifier directement les données de la structure originale, rendant vos mises à jour d'inventaire immédiates et persistantes sans avoir besoin de réassigner des valeurs à la map.

Aide-mémoire

Les maps peuvent stocker des pointeurs vers des structures, permettant la modification directe des données de la structure originale via la map :

type Product struct {
    Price    float64
    Quantity int
}

products := map[string]*Product{
    "laptop": &Product{Price: 999.99, Quantity: 5},
    "mouse":  &Product{Price: 25.50, Quantity: 20},
}

Lorsque vous utilisez des pointeurs comme valeurs de map, les modifications effectuées via la map affectent la structure originale :

// Mettre à jour le prix de l'ordinateur portable directement via la map
products["laptop"].Price = 899.99
fmt.Println(products["laptop"].Price) // affiche : 899.99

Ce modèle est précieux pour les applications nécessitant des mises à jour fréquentes des données, telles que les systèmes d'inventaire ou les profils d'utilisateurs, où la map sert de stockage de données principal.

Essayez vous-même

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Lire l'entrée
	var numProductsStr string
	var productDataStr string
	var operationsStr string
	
	fmt.Scanln(&numProductsStr)
	fmt.Scanln(&productDataStr)
	fmt.Scanln(&operationsStr)
	
	// TODO: Définir la structure Product ici
	
	// TODO: Créer une map pour stocker les pointeurs de produits
	
	// TODO: Créer une slice pour maintenir l'ordre des produits (pour assurer une sortie cohérente)
	
	// TODO: Analyser les données des produits et remplir la map
	// Rappel :
	// - Diviser productDataStr par des virgules pour obtenir les entrées individuelles
	// - Pour chaque entrée, diviser par des deux-points pour obtenir le nom, le prix, la quantité
	// - Convertir les chaînes de prix et de quantité vers les types appropriés
	// - Stocker le pointeur vers la structure Product dans la map
	// - Ajouter le nom du produit à la slice d'ordre
	
	// TODO: Afficher l'inventaire initial
	// Utiliser la slice d'ordre pour itérer à travers les produits de manière cohérente
	// Format : "[name]: $[price] (Stock: [quantity])"
	
	// TODO: Analyser et appliquer les opérations de mise à jour
	// Rappel :
	// - Diviser operationsStr par des virgules pour obtenir les opérations individuelles
	// - Pour chaque opération, diviser par des deux-points pour obtenir le type, le nom, la valeur
	// - Mettre à jour le champ approprié directement via le pointeur de la map
	// - Imprimer un message de mise à jour pour chaque opération
	
	// TODO: Afficher l'inventaire mis à jour
	// À nouveau, utiliser la slice d'ordre pour une sortie cohérente
	// Calculer la valeur totale lors de l'affichage
	
	// TODO: Calculer et afficher la valeur totale de l'inventaire
	// Format : "Total Inventory Value: $[total_value]"
}
quiz iconTestez-vous

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