Heim > Backend-Entwicklung > Golang > Warum ändert das Ändern von Werten in der Bereichsschleife von Go nicht das ursprüngliche Array?

Warum ändert das Ändern von Werten in der Bereichsschleife von Go nicht das ursprüngliche Array?

Susan Sarandon
Freigeben: 2024-12-18 04:04:09
Original
736 Leute haben es durchsucht

Why Doesn't Modifying Values in Go's Range Loop Change the Original Array?

Bereichsreferenzen statt Werte

In Go iteriert das Schlüsselwort „range“ über eine Sequenz, beispielsweise ein Array oder ein Slice, und bietet Zugriff sowohl auf den Schlüssel (Index) als auch auf den Wert jedes Elements. Aus Leistungsgründen arbeitet das Schlüsselwort „range“ jedoch mit einer Kopie des Originalwerts. Dies bedeutet, dass alle Änderungen, die am von range zurückgegebenen Wert vorgenommen werden, nicht im ursprünglichen Array widergespiegelt werden.

Beispiel

Bedenken Sie den folgenden Code:

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Attempting to modify a value returned by range
    for _, e := range array {
        e.field = "foo"
    }

    // Printing the values after the range loop
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Nach dem Login kopieren

Beim Ausführen dieses Codes wird „000000“ für alle Elemente ausgegeben, da die an e.field innerhalb der ersten Bereichsschleife vorgenommenen Änderungen auf a angewendet werden kopieren und den ursprünglichen Wert im Array nicht beeinflussen.

Lösung

Um die Werte eines Arrays mithilfe einer Bereichsschleife zu ändern, müssen Sie Array-Index anstelle des vom Bereich zurückgegebenen Werts. Dies kann erreicht werden, indem der Index mithilfe des Platzhalters _ in der Bereichsschleife erfasst wird.

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Using the array index to modify values
    for idx, _ := range array {
        array[idx].field = "foo"
    }

    // Printing the values after the range loop
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Nach dem Login kopieren
Dieser geänderte Code ändert erfolgreich die Werte des Felds für alle Elemente im Array und gibt für jedes „foo“ aus Element.

Das obige ist der detaillierte Inhalt vonWarum ändert das Ändern von Werten in der Bereichsschleife von Go nicht das ursprüngliche Array?. 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