Maison > développement back-end > Golang > Comment déterminer si un pointeur passé en argument de fonction est en cours de modification, ou si la copie est en cours de modification ?

Comment déterminer si un pointeur passé en argument de fonction est en cours de modification, ou si la copie est en cours de modification ?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2024-02-06 10:15:11
avant
1113 Les gens l'ont consulté

Comment déterminer si un pointeur passé en argument de fonction est en cours de modification, ou si la copie est en cours de modification ?

Contenu des questions

package main

import (
    "fmt"
)

type Numbers struct {
    x int
    y int
}

func initial(number *Numbers) {
    number.x = 1
    number.y = 1
}

func final(number *Numbers) {
    number = &Numbers{2, 2}
}

func main() {
    p := Numbers{0, 0}
    fmt.Println(p) //Prints {0 0}

    initial(&p)
    fmt.Println(p) //Prints {1 1}

    final(&p)
    fmt.Println(p) //Expected to print {2, 2} but prints {1, 1}
}
Copier après la connexion

Pourquoi initial 函数修改指针,而 final la fonction modifie une copie d'un pointeur ?

initialfinal的函数参数都指向pmain中的内存地址; initial 能够更改 p,而 final je ne peux pas.

Toute explication sur la raison pour laquelle cela se produit serait grandement appréciée.


Bonne réponse


Pour modifier les données pointées par un pointeur, il faut déréférencer le pointeur. L'opérateur de déréférencement est *。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1 被转换为 (*number).x = 1.

Cette traduction implicite peut prêter à confusion, mais vous devriez voir que si la traduction ne se produit pas, alors l'expression number.x = 1 将毫无意义,因为 number est de type pointeur et les pointeurs n'ont pas de champs.

En résumé, initial 函数具有隐式指针解引用,而 final ne le fait pas.

Si vous le souhaitez final 更改为显式且正确地取消引用,*number = Numbers{2, 2},那么它也会更改 p.

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