„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum ändert meine Go -Range -Schleife keine Array -Elemente?

Warum ändert meine Go -Range -Schleife keine Array -Elemente?

Veröffentlicht am 2025-02-04
Durchsuche:485

Why Does My Go Range Loop Not Modify Array Elements?

Rückgabe von Adressen anstelle von Werten für Bereichsreferenzen

die Situation betrachten . Dies kann zu unerwartetem Verhalten führen, wie im folgenden Go -Code zu sehen ist:

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

In diesem Beispiel ist es die Absicht, die Eigenschaft "Feld" jedes Elements im Array zu ändern. Da die Range -Anweisung jedoch eine Kopie des Wertes zurückgibt, werden die Änderungen an eine lokale Kopie vorgenommen und betreffen nicht das ursprüngliche Array. Infolgedessen zeigt die Ausgabe alle "Feld" -Heeigenschaften als den Standardwert.

Um dieses Problem anzugehen, können Sie die Adresse des Elements in einer Bereichsschleife nicht zurückgeben. Stattdessen sollten Sie das Array mit dem Index durchführen, wie unten gezeigt:

func main() {
    var array [10]MyType

    for idx, _ := range array {
        array[idx].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

Durch die Verwendung des Index anstelle des Wertes in der für die für die Schleife stehende Änderungen, die an der Eigenschaft "Feld" vorgenommen wurden, werden im Original -Array reflektiert.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3