Maison > développement back-end > Golang > Pourquoi le déréférencement d'un pointeur dans Go ne modifie-t-il pas la valeur d'origine ?

Pourquoi le déréférencement d'un pointeur dans Go ne modifie-t-il pas la valeur d'origine ?

Mary-Kate Olsen
Libérer: 2024-12-08 12:53:11
original
349 Les gens l'ont consulté

Why Doesn't Dereferencing a Pointer in Go Modify the Original Value?

Déréférencement de pointeur dans Go : que se passe-t-il ?

En plongeant dans le monde de la programmation dans Go, vous pouvez rencontrer un comportement intrigant lié au déréférencement de pointeur, en particulier lorsque travailler avec des structures. Prenons l'exemple suivant :

package main

import "fmt"

type Vertex struct {
    X, Y int
}

var (
    p = Vertex{1, 2}  // has type Vertex
    q = &Vertex{1, 2} // has type *Vertex
    r = Vertex{X: 1}  // Y:0 is implicit
    s = Vertex{}      // X:0 and Y:0
)

func main() {
    t := *q
    q.X = 4
    u := *q
    fmt.Println(p, q, r, s, t, u, t == u)
}
Copier après la connexion

L'exécution de ce code produit des résultats surprenants :

{1 2} &{4 2} {1 0} {0 0} {1 2} {4 2} false
Copier après la connexion

Vous pourriez vous attendre à ce que t passe à {4, 2} après avoir modifié q.X, mais ce n'est pas le cas arriver. Quelle est la raison de ce comportement ?

Explication du déréférencement du pointeur

La clé pour comprendre cela est le déréférencement du pointeur. Dans Go, lorsque vous déréférencez un pointeur (par exemple, *q), vous créez une copie de la valeur vers laquelle il pointe. Ainsi, t := *q crée une copie séparée de la structure Vertex référencée par q.

Modification de l'exemple 28 clarifiée :

Dans votre exemple modifié, lorsque vous définissez q.X = 4, vous modifiez uniquement la structure pointée par q. Puisque t est une copie, il conserve ses valeurs d'origine.

Comparaison de Go et C/C

Vous avez mentionné le comportement qui semble étrange d'un point de vue C/C. Cependant, C/C se comportent de la même manière. Prenons cet exemple :

#include <iostream>

struct Vertex
{
    int x;
    int y;
};

int main()
{
    Vertex v = Vertex{1, 2};
    Vertex* q = &v;
    Vertex t = *q;
    q->x = 4;
    std::cout << "*q: " << *q << "\n";
    std::cout << " t: " << t << "\n";
}
Copier après la connexion

Ce code C produit le même comportement :

*q: { 4, 2 }
t: { 1, 2 }
Copier après la connexion

Conclusion

En résumé, lorsque vous déréférencez un pointeur dans Go, vous' re créer une copie de la valeur sous-jacente. Pour observer les modifications apportées via un pointeur, vous devez utiliser un pointeur lui-même, comme dans l'exemple modifié :

func main() {
    t := q
    q.X = 4
    u := *q
    fmt.Println(p, q, r, s, t, u, *t == u)
}
Copier après la connexion

Cela produira le résultat attendu de {1 2} &{4 2} {1 0} {0 0} {4 2} {4 2} vrai.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal