Maison > développement back-end > Golang > Comment ajouter correctement à une tranche dans une structure Go ?

Comment ajouter correctement à une tranche dans une structure Go ?

Susan Sarandon
Libérer: 2024-12-13 01:29:14
original
202 Les gens l'ont consulté

How to Correctly Append to a Slice within a Go Struct?

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))
}
Copier après la connexion

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)
}
Copier après la connexion

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))
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal