Auf Slice-Werte in einer Karte zugreifen
Beim Arbeiten mit Karten, die Slices als Werte enthalten, ist es wichtig, die Auswirkungen des direkten Anhängens zu verstehen das vom Map-Accessor zurückgegebene Slice. Wie im Beispiel unten gezeigt, ändert die einfache Zuweisung des angehängten Slice zum zurückgegebenen Slice nicht den zugrunde liegenden Wert in der Karte.
<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>
Das Problem ergibt sich aus der Tatsache, dass „append“ ein neues Slice zurückgibt, wenn der zugrunde liegende Array muss wachsen. Daher funktioniert der folgende Code nicht wie vorgesehen:
<code class="go">mappedAminoAcid, ok := aminoAcidsToCodons[aminoAcid] if ok { mappedAminoAcid = append(mappedAminoAcid, codon) // Intended but incorrect }</code>
Dieses Verhalten ähnelt dem von Zeichenfolgen. Zum Beispiel:
<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>
Um dieses Problem zu beheben und den zugrunde liegenden Wert der Karte zu ändern, muss das angehängte Segment dem entsprechenden Karteneintrag neu zugewiesen werden. Glücklicherweise gibt es einen einfacheren Ansatz: Nutzen Sie die Tatsache, dass ein Null-Slice ein gültiges erstes Argument für append ist.
<code class="go">aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon)</code>
Das obige ist der detaillierte Inhalt vonWie ändere ich Slice-Werte in einer Karte in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!