在 Go 語言中,函數的參數傳遞是值傳遞的方式。當函數被調用時,函數參數的值會被拷貝到函數的參數變量中。
對於指針類型的參數,指針本身也是以值的方式進行傳遞。這意味着函數內部的指針參數將獲得原始指針的拷貝,但這個拷貝仍然指向相同的內存地址。
當在函數內部修改通過指針傳遞的變量時,由於指針本身是值傳遞的,原始指針的拷貝在函數內部會指向同一塊內存地址,因此對指針所指的變量的修改將反映在函數外部。
下面是一個示例代碼,演示了指針參數的值傳遞:
func modifyPointer(ptr *int) {
*ptr = 42
}
func main() {
var value int = 10
fmt.Println("Before:", value) // 輸出: Before: 10
modifyPointer(&value)
fmt.Println("After:", value) // 輸出: After: 42
}
在上述示例中,modifyPointer
函數接受一個指向整型的指針作爲參數,並將指針所指的變量修改爲 42
。在 main
函數中,我們聲明瞭一個整型變量 value
,然後通過 &value
將其地址傳遞給 modifyPointer
函數。當函數執行完畢後,value
的值已經被修改爲 42
。
總結起來,雖然指針本身是通過值傳遞的方式進行傳遞,但是通過指針可以修改函數外部的變量,因爲指針拷貝後仍然指向相同的內存地址。這使得我們可以在函數內部修改通過指針傳遞的變量。