Heim >Backend-Entwicklung >Golang >Warum ändert das Ändern von Strukturwerten in einer Go-Range-Schleife nicht den ursprünglichen Slice?

Warum ändert das Ändern von Strukturwerten in einer Go-Range-Schleife nicht den ursprünglichen Slice?

Barbara Streisand
Barbara StreisandOriginal
2024-12-20 19:05:11278Durchsuche

Why Doesn't Modifying Struct Values in a Go Range Loop Change the Original Slice?

Warum Werte in einem Bereich einer Typstruktur nicht geändert werden können

In Go erstellt ein Bereich einer Typstruktur, wie ein Slice, einen Ansicht der zugrunde liegenden Daten statt einer Kopie. Bei der Iteration über einen Bereich wirken sich alle an der Iterationsvariablen vorgenommenen Änderungen nur auf diese bestimmte Ansicht aus, nicht auf die Originaldaten.

Um dies zu verstehen, betrachten Sie den folgenden Codeausschnitt:

type myStruct struct {
    Name  string
    Count int
}

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

    for _, elem := range chartRecords {
        elem.Count = 0
        fmt.Println(elem)
    }

    fmt.Println(chartRecords)
}

Dies Der Codeausschnitt iteriert über den Bereich von chartRecords, ändert das Count-Feld jeder Iterationsvariablen auf 0 und gibt die geänderte Variable aus. Wenn jedoch der ursprüngliche chartRecords-Slice gedruckt wird, wird angezeigt, dass sich die Werte des Count-Felds nicht geändert haben.

Dies liegt daran, dass die for-Schleife mit einer Range-Klausel eine Kopie jedes Elements im Bereich erstellt. Änderungen an der Kopie wirken sich nicht auf das Originalelement aus. Um die ursprünglichen Elemente zu ändern, müssen Sie sie explizit aktualisieren, indem Sie auf ihren Index im Slice zugreifen. Zum Beispiel:

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

    for i, elem := range chartRecords {
        chartRecords[i] = myStruct{Count: 0, Name: elem.Name}
    }

    fmt.Println(chartRecords)
}

In diesem Beispiel wird die for-Schleife mit einer Range-Klausel verwendet, um den Bereich von chartRecords zu durchlaufen. Bei jeder Iteration wird der Index verwendet, um auf das ursprüngliche Element im Slice zuzugreifen, und der Wert des Elements wird aktualisiert. Dieser Ansatz stellt sicher, dass die Änderungen im ursprünglichen chartRecords-Slice widergespiegelt werden.

Das obige ist der detaillierte Inhalt vonWarum ändert das Ändern von Strukturwerten in einer Go-Range-Schleife nicht den ursprünglichen Slice?. 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