首頁  >  文章  >  後端開發  >  如何確定作為函數參數傳遞的指標是否正在被修改,或者副本是否正在被修改?

如何確定作為函數參數傳遞的指標是否正在被修改,或者副本是否正在被修改?

WBOY
WBOY轉載
2024-02-06 10:15:11990瀏覽

如何確定作為函數參數傳遞的指標是否正在被修改,或者副本是否正在被修改?

問題內容

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 函數會修改指針的副本?

initialfinal的函數參數都指向pmain#中的記憶體位址;initial能夠更改p,而final 則不能。

任何解釋為什麼會出現這種情況,我們將不勝感激。


正確答案


要修改指標指向的數據,必須取消引用該指標。解引用運算子是 *。然而,為了方便使用,Go 在某些情況下會隱式插入解引用操作。例如,number.x = 1 被轉換為 (*number).x = 1

這種隱式翻譯可能會令人困惑,但您應該看到,如果翻譯沒有發生,那麼表達式number.x = 1 將毫無意義,因為number 是指標類型,指標沒有欄位。

綜上所述,initial 函數有隱式指標解引用,而 final 則沒有。

如果您將final 更改為明確且正確地取消引用,*number = Numbers{2, 2},那麼它也會更改p

以上是如何確定作為函數參數傳遞的指標是否正在被修改,或者副本是否正在被修改?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除