Maison  >  Article  >  développement back-end  >  Comment modifier les valeurs de tranche dans une carte dans Go ?

Comment modifier les valeurs de tranche dans une carte dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-05 01:57:02549parcourir

How to Modify Slice Values in a Map in Go?

Accès aux valeurs de tranche dans une carte

Lorsque vous travaillez avec des cartes qui contiennent des tranches comme valeurs, il est crucial de comprendre les implications de l'ajout direct à la tranche renvoyée par l'accesseur de carte. Comme le montre l'exemple ci-dessous, le simple fait d'attribuer la tranche ajoutée à la tranche renvoyée ne modifie pas la valeur sous-jacente dans la carte.

<code class="go">var aminoAcidsToCodons map[rune][]string
for codon, aminoAcid := range utils.CodonsToAminoAcid {
    mappedAminoAcid := aminoAcidsToCodons[aminoAcid] // Return slice by value

    if ok := len(mappedAminoAcid) > 0; ok { // Check if slice is nil
        mappedAminoAcid = append(mappedAminoAcid, codon) // Create a new slice
        aminoAcidsToCodons[aminoAcid] = mappedAminoAcid // Reset map value
    } else {
        aminoAcidsToCodons[aminoAcid] = []string{codon}
    }
}</code>

Le problème vient du fait que l'ajout renvoie une nouvelle tranche si la tranche sous-jacente le tableau doit croître. Par conséquent, le code suivant ne fonctionne pas comme prévu :

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

Ce comportement est similaire à celui des chaînes. Par exemple :

<code class="go">var x map[string]string
x["a"] = "foo"

y := x["a"] // Copy string by value
y = "bar"

// x["a"] is still "foo" since a new string is created in y</code>

Pour résoudre ce problème et modifier la valeur sous-jacente de la carte, la tranche ajoutée doit être réaffectée à l'entrée de carte correspondante. Heureusement, une approche plus simple existe : profitez du fait qu'une tranche nulle est un premier argument valide pour append.

<code class="go">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