Warum kann ich nicht direkt an ein Slice in einer Go-Map anhängen?

Susan Sarandon
Freigeben: 2024-11-07 14:38:02
Original
699 Leute haben es durchsucht

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

Go: Warum kann ich nicht direkt an ein in einer Karte gefundenes Segment anhängen?

In Go können Sie beim Arbeiten mit Karten Es kann vorkommen, dass Sie Werte an einen vorhandenen Ausschnitt innerhalb der Karte anhängen müssen. Der Versuch, direkt an das durch den Zugriff zurückgegebene Slice anzuhängen, kann jedoch dazu führen, dass die Änderungen nicht gespeichert werden.

Um dieses Problem zu veranschaulichen, betrachten Sie das folgende Codefragment:

<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>
Nach dem Login kopieren

Im In der kommentierten Zeile wird versucht, direkt an das von „aminoAcidsToCodons[aminoAcid]“ zurückgegebene Slice anzuhängen. Dieser Vorgang schlägt jedoch fehl, da eine Kopie des Slice zurückgegeben wird und kein Verweis auf das Slice in der Karte.

Der Grund für dieses Verhalten liegt in der Art und Weise, wie das Anhängen in Go funktioniert. Wenn die Kapazität des zugrunde liegenden Arrays eines Slice überschritten wird, erstellt „append“ ein neues Slice und kopiert die vorhandenen Elemente hinein. Dieses neue Slice wird dann zurückgegeben, während das ursprüngliche Slice unverändert bleibt.

Um erfolgreich an ein Slice in einer Karte anzuhängen, müssen Sie daher das Ergebnis des Anhängevorgangs wieder dem entsprechenden Schlüssel in der Karte zuweisen. Dies kann weiter vereinfacht werden, indem ein Null-Slice als erstes Argument zum Anhängen verwendet wird, wie im folgenden geänderten Code zu sehen ist:

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

Das obige ist der detaillierte Inhalt vonWarum kann ich nicht direkt an ein Slice in einer Go-Map anhängen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!