Maison >développement back-end >Golang >Pourquoi la modification d'une structure dans une boucle de plage Go ne met-elle pas à jour la tranche d'origine ?

Pourquoi la modification d'une structure dans une boucle de plage Go ne met-elle pas à jour la tranche d'origine ?

DDD
DDDoriginal
2024-12-20 10:45:09484parcourir

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

Élément sur des structures dans Go

Dans Go, lors de l'examen d'une tranche de structures, les valeurs obtenues à partir de la variable de plage sont des copies. En tant que tel, toute modification apportée à ces valeurs n'affectera pas la tranche d'origine.

Considérez l'exemple suivant :

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)
    }
}

L'exécution de ce code produira le résultat suivant :

======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

Comme vous pouvez le constater, les valeurs de la tranche chartRecords ne sont pas modifiées, même si nous avons incrémenté le champ Count de chaque élément de la plage. En effet, la variable de plage elem est une copie de l'élément d'origine dans la tranche.

Pour mettre à jour la tranche d'origine, vous devez réattribuer l'élément mis à jour à la tranche à l'index correspondant :

for i, elem := range chartRecords {
    elem.Count++
    chartRecords[i] = elem
}

Avec cette correction, l'exécution à nouveau du code produira le résultat suivant :

======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

Maintenant, les valeurs dans la tranche chartRecords sont mises à jour comme attendu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn