Heim >Backend-Entwicklung >Golang >Warum erfordert das Anhängen an einen in einer Go-Map gefundenen Slice eine Neuzuweisung?

Warum erfordert das Anhängen an einen in einer Go-Map gefundenen Slice eine Neuzuweisung?

Barbara Streisand
Barbara StreisandOriginal
2024-11-05 06:41:02372Durchsuche

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

Direktes Anhängen an ein in einer Go-Karte gefundenes Segment

Das direkte Anhängen an ein von einer Karte abgerufenes Segment kann eine schwierig zu verstehende Aufgabe sein. Schauen wir uns das Problem und seine Lösung genauer an.

Im bereitgestellten Code wurde versucht, an einen in einer Karte gespeicherten Slice anzuhängen:

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

Dies schlug jedoch fehl, da „append“ zurückgegeben wurde ein neues Slice, wenn das zugrunde liegende Array wachsen muss. Daher ist es notwendig, das neue Slice wieder dem Map-Eintrag zuzuweisen.

Aus diesem Grund funktioniert die direkte Zuweisung nicht:

Wenn ein Slice von einer Funktion zurückgegeben oder über eine Map aufgerufen wird, Es ist eine Kopie des ursprünglichen Slice, kein Zeiger. An der Kopie vorgenommene Änderungen werden nicht im Original widergespiegelt.

Betrachten Sie beispielsweise eine Zeichenfolge:

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

Da ein Null-Slice als anfängliches Argument zum Anhängen akzeptabel ist, kann der Code dies tun vereinfacht werden:

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

Zusammenfassend lässt sich sagen, dass es beim Anhängen an einen aus einer Karte abgerufenen Slice wichtig ist, sich daran zu erinnern, dass der zurückgegebene Slice eine Kopie ist, und den neuen Slice wieder dem Karteneintrag zuzuweisen.

Das obige ist der detaillierte Inhalt vonWarum erfordert das Anhängen an einen in einer Go-Map gefundenen Slice eine Neuzuweisung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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