Maison  >  Article  >  développement back-end  >  Pourquoi l'utilisation d'un récepteur de valeur entraîne-t-elle une modification incorrecte des tranches dans une structure Go ?

Pourquoi l'utilisation d'un récepteur de valeur entraîne-t-elle une modification incorrecte des tranches dans une structure Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-17 05:03:03971parcourir

Why Does Using a Value Receiver Lead to Incorrect Slice Modification in a Go Struct?

Suppression d'éléments d'une tranche dans une structure (résolu)

Dans l'extrait de code fourni, il y a un problème lors de la tentative de suppression d'un élément d’une tranche dans une structure à l’aide d’un récepteur de valeur. Cela conduit à une modification incorrecte de la tranche dans la structure d'origine.

Pour résoudre ce problème, un récepteur de pointeur doit être utilisé dans la méthode qui modifie la tranche. En effet, les récepteurs de valeur Go créent une copie de la valeur du récepteur, ce qui signifie que toutes les modifications apportées au récepteur dans la méthode ne sont pas reflétées dans la structure d'origine.

Voici le code corrigé :

func (guest *Guest) removeFriend(id int) {
    for i, other := range guest.friends {
        if other == id {
            guest.friends = append(guest.friends[:i], guest.friends[i+1:]...)
            break
        }
    }
}

En utilisant un récepteur de pointeur (*Guest), la méthode modifie la tranche d'amis de la structure Guest d'origine, garantissant que l'élément est supprimé correctement.

Explication :

Lorsqu'une tranche est passée par valeur, la méthode du récepteur opère sur une copie de la tranche. Lorsque des modifications sont apportées à la tranche, elles sont uniquement répercutées dans la copie et non dans la tranche d'origine. Cependant, l'utilisation d'un récepteur pointeur permet à la méthode de modifier la tranche d'origine, car le récepteur est désormais un pointeur vers la structure d'origine.

Exemple d'utilisation :

guest := &Guest{
    id:      1,
    name:    "Bob",
    surname: "Pats",
    friends: []int{1, 2, 3, 4, 5},
}

fmt.Println(guest)
guest.removeFriend(3)
fmt.Println(guest)

Sortie :

&{1 Bob Pats [1 2 3 4 5]}
&{1 Bob Pats [1 2 4 5]}

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!

Déclaration:
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