"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi la modification du pointeur dans les fonctions Go n'affecte-t-elle parfois pas la valeur d'origine ?

Pourquoi la modification du pointeur dans les fonctions Go n'affecte-t-elle parfois pas la valeur d'origine ?

Publié le 2024-11-07
Parcourir:418

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

Modification du pointeur dans Go, comprendre les différences

Dans Go, lors du passage d'un pointeur vers une fonction, nous avons généralement l'intention de modifier la valeur pointé par ce pointeur. Généralement, cela peut être réalisé via le déréférencement, comme illustré dans le code suivant :

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    *p = Test{4}
}

Cependant, il peut y avoir des cas où la valeur de la structure pointée par le pointeur passé reste inchangée, même après sa modification dans la fonction. Pour comprendre pourquoi cela se produit, examinons un extrait de code modifié :

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 2
}

func f(p *Test) {
    // Attempt to modify the pointer value
    p = &Test{4}
}

Cet extrait de code tente de modifier la valeur du pointeur p, mais ne parvient pas à modifier la valeur de la structure pointée à l'origine. La raison en est que l'affectation p = &Test{4} dans la fonction f() ne modifie que la valeur de la variable locale p.

Dans la fonction f(), p est traité comme une variable locale , et lui attribuer une nouvelle valeur n’affecte pas la valeur du pointeur transmis par la fonction main(). Par conséquent, la structure pointée par p reste inchangée, reflétée dans la valeur inchangée de i.Value lors de l'impression.

En revanche, le code suivant montre l'approche correcte pour modifier la valeur de la structure :

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    p.Value = 4
}

Dans ce code, p.Value = 4 modifie directement le champ Value de la structure pointée par p. Cela entraîne la modification souhaitée de la valeur de la structure, qui se reflète dans la valeur mise à jour de i.Value lors de l'impression.

Il convient de noter que l'attribution d'une nouvelle valeur au pointeur lui-même (comme dans p = &Test{ 4}) a un effet différent. Cette affectation créerait un nouveau pointeur pointant vers une nouvelle structure, mais n'affecterait pas la valeur de la structure pointée par le pointeur d'origine transmis par la fonction main().

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3