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.99Ce 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.
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
FacileConstruisez 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 à :
- Définir une structure
Productavec les champs suivants :Price(float64) - le prix du produitQuantity(int) - la quantité en stock du produit
- 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 - 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
Productet stocker un pointeur vers celle-ci dans la map
- Afficher l'inventaire initial avec l'en-tête
"Initial Inventory:" - Afficher chaque produit au format :
"[name]: $[price] (Stock: [quantity])" - 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]"
- Afficher l'inventaire mis à jour avec l'en-tête
"Updated Inventory:" - Afficher à nouveau chaque produit dans le même format que l'affichage initial
- 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.99Ce 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]"
}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