Maison > Article > développement back-end > 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 ?
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} }
Pourquoi initial
函数修改指针,而 final
la fonction modifie une copie d'un pointeur ?
initial
和final
的函数参数都指向p
在main
中的内存地址; initial
能够更改 p
,而 final
je ne peux pas.
Toute explication sur la raison pour laquelle cela se produit serait grandement appréciée.
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!