Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menentukan sama ada penuding diluluskan sebagai hujah fungsi sedang diubah suai, atau jika salinan sedang diubah suai?
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} }
Mengapa fungsi initial
函数修改指针,而 final
mengubah suai salinan penunjuk?
initial
和final
的函数参数都指向p
在main
中的内存地址; initial
能够更改 p
,而 final
tak boleh.
Sebarang penjelasan mengapa ini berlaku amatlah dihargai.
Untuk mengubah suai data yang ditunjukkan oleh penunjuk, penunjuk mesti dinyahrujuk. Pengendali dereference ialah *
。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1
被转换为 (*number).x = 1
.
Terjemahan tersirat ini boleh mengelirukan, tetapi anda harus melihat bahawa jika terjemahan tidak berlaku, maka ungkapan number.x = 1
将毫无意义,因为 number
adalah jenis penunjuk dan penunjuk tidak mempunyai medan.
Ringkasnya, initial
函数具有隐式指针解引用,而 final
tidak.
Jika anda mahu final
更改为显式且正确地取消引用,*number = Numbers{2, 2}
,那么它也会更改 p
.
Atas ialah kandungan terperinci Bagaimana untuk menentukan sama ada penuding diluluskan sebagai hujah fungsi sedang diubah suai, atau jika salinan sedang diubah suai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!