Heim > Backend-Entwicklung > Golang > Warum wird durch das Ändern einer Struktur in einer Go-Range-Schleife das ursprüngliche Slice nicht aktualisiert?

Warum wird durch das Ändern einer Struktur in einer Go-Range-Schleife das ursprüngliche Slice nicht aktualisiert?

DDD
Freigeben: 2024-12-20 10:45:09
Original
365 Leute haben es durchsucht

Why doesn't modifying a struct in a Go range loop update the original slice?

Ranging über Strukturen in Go

In Go sind die aus der Range-Variablen erhaltenen Werte beim Rangeing über einen Teil von Strukturen Kopien. Daher wirken sich alle an diesen Werten vorgenommenen Änderungen nicht auf das ursprüngliche Slice aus.

Betrachten Sie das folgende Beispiel:

package main

import (
    "fmt"
)

type myStruct struct {
    Name  string
    Count int
}

func main() {
    chartRecords := []myStruct{}

    for i := 0; i < 5; i++ {
        n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)}
        chartRecords = append(chartRecords, n)
    }

    fmt.Printf("======ORIGINAL VALUES========\n")
    for _, elem := range chartRecords {
        fmt.Printf("No: %2d | Count: %2d | Name = %s\n", elem.Count, elem.Name)
    }

    fmt.Printf("======MODIFIED VALUES EXPECTED========\n")
    for _, elem := range chartRecords {
        elem.Count++
        fmt.Printf("No: %2d | Count: %2d | Name = %s\n", elem.Count, elem.Name)
    }

    fmt.Printf("======CHECK AGAIN AND VALUES ARE BACK TO ORIGINAL========\n")
    for _, elem := range chartRecords {
        fmt.Printf("No: %2d | Count: %2d | Name = %s\n", elem.Count, elem.Name)
    }
}
Nach dem Login kopieren

Das Ausführen dieses Codes erzeugt die folgende Ausgabe:

======ORIGINAL VALUES========
No:  0 | Count:  0 | Name = Joe 0
No:  1 | Count:  1 | Name = Joe 1
No:  2 | Count:  2 | Name = Joe 2
No:  3 | Count:  3 | Name = Joe 3
No:  4 | Count:  4 | Name = Joe 4
======MODIFIED VALUES EXPECTED========
No:  1 | Count:  1 | Name = Joe 0
No:  2 | Count:  2 | Name = Joe 1
No:  3 | Count:  3 | Name = Joe 2
No:  4 | Count:  4 | Name = Joe 3
No:  5 | Count:  5 | Name = Joe 4
======CHECK AGAIN AND VALUES ARE BACK TO ORIGINAL========
No:  0 | Count:  0 | Name = Joe 0
No:  1 | Count:  1 | Name = Joe 1
No:  2 | Count:  2 | Name = Joe 2
No:  3 | Count:  3 | Name = Joe 3
No:  4 | Count:  4 | Name = Joe 4
Nach dem Login kopieren

Wie Sie sehen können, werden die Werte im chartRecords-Slice nicht geändert, obwohl wir das Count-Feld jedes Elements im Bereich erhöht haben. Dies liegt daran, dass die Bereichsvariable elem eine Kopie des ursprünglichen Elements im Slice ist.

Um das ursprüngliche Slice zu aktualisieren, müssen Sie das aktualisierte Element am entsprechenden Index wieder dem Slice zuweisen:

for i, elem := range chartRecords {
    elem.Count++
    chartRecords[i] = elem
}
Nach dem Login kopieren

Mit dieser Korrektur führt eine erneute Ausführung des Codes zu folgender Ausgabe:

======ORIGINAL VALUES========
No:  0 | Count:  0 | Name = Joe 0
No:  1 | Count:  1 | Name = Joe 1
No:  2 | Count:  2 | Name = Joe 2
No:  3 | Count:  3 | Name = Joe 3
No:  4 | Count:  4 | Name = Joe 4
======MODIFIED VALUES EXPECTED========
No:  1 | Count:  1 | Name = Joe 0
No:  2 | Count:  2 | Name = Joe 1
No:  3 | Count:  3 | Name = Joe 2
No:  4 | Count:  4 | Name = Joe 3
No:  5 | Count:  5 | Name = Joe 4
======CHECK AGAIN AND VALUES ARE STILL MODIFIED========
No:  1 | Count:  1 | Name = Joe 0
No:  2 | Count:  2 | Name = Joe 1
No:  3 | Count:  3 | Name = Joe 2
No:  4 | Count:  4 | Name = Joe 3
No:  5 | Count:  5 | Name = Joe 4
Nach dem Login kopieren

Jetzt werden die Werte im ChartRecords-Slice aktualisiert als erwartet.

Das obige ist der detaillierte Inhalt vonWarum wird durch das Ändern einer Struktur in einer Go-Range-Schleife das ursprüngliche Slice nicht aktualisiert?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage