Maison >développement back-end >Golang >Pourquoi ne puis-je pas ajouter directement une tranche dans une carte Go ?

Pourquoi ne puis-je pas ajouter directement une tranche dans une carte Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-07 14:38:02829parcourir

Why Can't I Append Directly to a Slice in a Go Map?

Go : Pourquoi ne puis-je pas ajouter directement une tranche trouvée dans une carte ?

Dans Go, lorsque vous travaillez avec des cartes, vous peut rencontrer une situation dans laquelle vous devez ajouter des valeurs à une tranche existante dans la carte. Cependant, tenter d'ajouter directement à la tranche renvoyée en y accédant peut entraîner le non-stockage des modifications.

Pour illustrer ce problème, considérons le fragment de code suivant :

<code class="go">aminoAcidsToCodons := map[rune][]string{}
for codon, aminoAcid := range utils.CodonsToAminoAcid {
    mappedAminoAcid := aminoAcidsToCodons[aminoAcid] // Returning a copy of the slice
                                                  // instead of a reference

    // Not working: mappedAminoAcid = append(mappedAminoAcid, codon)

    aminoAcidsToCodons[aminoAcid] = append(mappedAminoAcid, codon) // Using long-form access
}</code>

Dans le ligne commentée, une tentative est faite pour l'ajouter directement à la tranche renvoyée par aminoAcidsToCodons[aminoAcid]. Cependant, cette opération échoue puisque ce qui est renvoyé est une copie de la tranche, et non une référence à la tranche dans la carte.

La raison de ce comportement réside dans la façon dont l'append fonctionne dans Go. Lorsque la capacité du tableau sous-jacent d'une tranche est dépassée, append crée une nouvelle tranche et y copie les éléments existants. Cette nouvelle tranche est ensuite renvoyée, tandis que la tranche d'origine reste inchangée.

Par conséquent, pour réussir l'ajout à une tranche dans une carte, vous devez attribuer le résultat de l'opération d'ajout à la clé correspondante dans la carte. Cela peut être encore simplifié en utilisant une tranche nulle comme premier argument à ajouter, comme le montre le code modifié suivant :

<code class="go">aminoAcidsToCodons := map[rune][]string{}
for codon, aminoAcid := range utils.CodonsToAminoAcid {
    aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon)
}</code>

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