Maison  >  Article  >  développement back-end  >  Pourquoi l’ajout à une tranche trouvée dans une carte Go nécessite-t-il une réaffectation ?

Pourquoi l’ajout à une tranche trouvée dans une carte Go nécessite-t-il une réaffectation ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-05 06:41:02310parcourir

Why Does Appending to a Slice Found in a Go Map Require Reassignment?

Ajouter directement à une tranche trouvée dans une carte Go

Ajouter directement à une tranche récupérée à partir d'une carte peut être une tâche délicate à comprendre. Examinons le problème et sa solution.

Dans le code fourni, une tentative d'ajout à une tranche stockée dans une carte a été effectuée :

<code class="go">mappedAminoAcid, ok := aminoAcidsToCodons[aminoAcid]
if ok {
    // NOT WORKING: mappedAminoAcid = append(mappedAminoAcid, codon)
    aminoAcidsToCodons[aminoAcid] = append(mappedAminoAcid, codon)
}</code>

Cependant, cela a échoué car l'ajout renvoie une nouvelle tranche si le tableau sous-jacent doit croître. Par conséquent, il est nécessaire de réattribuer la nouvelle tranche à l'entrée de la carte.

Voici pourquoi l'affectation directe ne fonctionne pas :

Lorsqu'une tranche est renvoyée par une fonction ou accessible à partir d'une carte, c'est une copie de la tranche originale, pas un pointeur. Les modifications apportées à la copie ne sont pas reflétées dans l'original.

Par exemple, considérons une chaîne :

<code class="go">x := "foo"
y := x
y = "bar"
fmt.Println(x) // "foo" (unchanged)</code>

Puisqu'une tranche nulle est acceptable comme argument initial à ajouter, le code peut être simplifié :

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

En résumé, lors d'un ajout à une tranche récupérée à partir d'une carte, il est crucial de se rappeler que la tranche renvoyée est une copie, et d'attribuer la nouvelle tranche revient à l'entrée de la carte.

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