Go - Ajout à une tranche dans une structure
Dans Go, l'ajout à une tranche dans une structure nécessite une attention particulière aux références de variables. Cela peut devenir déroutant lorsque vous travaillez avec des tranches dans des structures, en particulier lorsque la méthode recevant la structure est un récepteur de pointeur.
Problème
Considérez le code suivant :
package main import "fmt" type MyBoxItem struct { Name string } type MyBox struct { Items []MyBoxItem } func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { return append(box.Items, item) } func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} // Initialize box with an empty slice AddItem(box, item1) // This is where the problem arises fmt.Println(len(box.Items)) }
Le problème survient lors de l'appel à la méthode AddItem. Lors de l'appel de la méthode comme AddItem(box, item1), au lieu de box.AddItem(item1), une nouvelle copie de la structure box est créée plutôt que de modifier l'original.
Solution
Pour résoudre ce problème, attribuez le résultat de la méthode AddItem à la tranche d'origine dans la structure :
func (box *MyBox) AddItem(item MyBoxItem) { box.Items = append(box.Items, item) }
En faisant Ainsi, les modifications apportées à la tranche dans la méthode AddItem sont reflétées dans le champ de tranche d'origine de la structure.
Fonction principale révisée
Avec la méthode AddItem mise à jour, la fonction principale corrigée devrait être :
func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} box.AddItem(item1) // Call the method correctly fmt.Println(len(box.Items)) }
Maintenant, la sortie imprimera correctement la longueur de la tranche Items, qui devrait être 1 après avoir ajouté le article.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!