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} }
為什麼 initial
函數會修改指針,而 final
函數會修改指針的副本?
initial
和final
的函數參數都指向p
在main
#中的記憶體位址;initial
能夠更改p
,而final
則不能。
任何解釋為什麼會出現這種情況,我們將不勝感激。
要修改指標指向的數據,必須取消引用該指標。解引用運算子是 *
。然而,為了方便使用,Go 在某些情況下會隱式插入解引用操作。例如,number.x = 1
被轉換為 (*number).x = 1
。
這種隱式翻譯可能會令人困惑,但您應該看到,如果翻譯沒有發生,那麼表達式number.x = 1
將毫無意義,因為number
是指標類型,指標沒有欄位。
綜上所述,initial
函數有隱式指標解引用,而 final
則沒有。
如果您將final
更改為明確且正確地取消引用,*number = Numbers{2, 2}
,那麼它也會更改p
。
以上是如何確定作為函數參數傳遞的指標是否正在被修改,或者副本是否正在被修改?的詳細內容。更多資訊請關注PHP中文網其他相關文章!