Comprendre la modification de valeur avec des pointeurs dans Go
Dans Go, les pointeurs permettent un accès indirect et une modification des valeurs. Cependant, comprendre le fonctionnement des pointeurs est crucial lors de leur transmission à des fonctions.
Lors du passage d'un pointeur vers une fonction, deux scénarios se présentent : modification de valeur ou réaffectation de pointeur.
Scénario 1 : Modification de la valeur
Considérez ce code :
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
*p = Test{4}
}
Ici, la fonction f reçoit un pointeur vers la structure Test. À l'intérieur de f, le pointeur déréférencé (*p) se voit attribuer une nouvelle structure Test avec une valeur de 4. Cela modifie effectivement la structure i d'origine dans la fonction principale, et la sortie est 4.
Scénario 2 : Réaffectation du pointeur
Maintenant, modifions légèrement le code :
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 2
}
func f(p *Test) {
// ?
p = &Test{4}
}
Dans ce cas, au lieu de modifier la valeur pointée, la fonction réaffecte le pointeur p à une nouvelle structure Test avec une valeur de 4. Puisque p est une variable locale dans f, ce changement n'affecte pas la original i struct dans la fonction principale, et la sortie reste 2.
Solution : Modification de la valeur pointée
Pour modifier la valeur pointée, nous devons déréférencer le pointeur et directement accéder au membre de la structure :
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
p.Value = 4
}
En utilisant p.Value, nous modifions le champ Value de la structure d'origine, ce qui donne une sortie de 4.
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