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().
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