探索& 和* 指標的用法和區別
在使用Go 函數時,遇到與將變數作為參數傳遞相關的錯誤是很正常的常見的。使用由 & 或 * 表示的指標通常可以解決這些問題。然而,了解它們的差異和正確的用法至關重要。
定義和用法
& 運算子傳回變數的記憶體位址,而 * 用於取消引用變數指標。在您的範例中,您將 u 定義為 User 類型,但不是指向 User 的指標。因此,您需要使用 &u,因為 json 套件中的 Decode 函數需要一個位址或指標。
如果 u 最初是使用 u := new(User) 或 var u *User 建立為指針,則& 在對 Decode 的呼叫中將變得不必要。
類比和範例
思考指標作為儲存位址的變數。與我們透過地址找到家類似,指標可以幫助檢索儲存在特定記憶體位置的資料。
假設您有一個代表記憶體中位址的變數 x。當您鍵入 &x 時,您實際上獲得了 x 本身的位址。但是,如果您鍵入 *x,您將重定向到儲存在 x 中的記憶體位置並檢索那裡的實際資料。
例如,如果您有一個保存值 10 的變數 y 並且您建立了一個指向它的指針,pointerToY,pointerToY 將儲存 y 的位址。
現在,&y 將為您提供 y 的位址,而 &pointerToY 將提供 y 的位址指標本身。
指針的樂趣
這裡有一個程式來進一步說明這些概念:
package main import "fmt" func main() { var y int var pointerToY *int var pointerToPointerToInt **int y = 10 pointerToY = &y pointerToPointerToInt = &pointerToY fmt.Println("pointerToY: ", pointerToY) fmt.Println("pointerToPointerToInt: ", pointerToPointerToInt) fmt.Println("*pointerToY: ", *pointerToY) // dereferencing to get y's value fmt.Println("*pointerToPointerToInt: ", *pointerToPointerToInt) fmt.Println("**pointerToPointerToInt: ", **pointerToPointerToInt) // dereferencing twice to get y's value }
這個程式示範了以下情況下的不同結果:使用指標和取消引用。它說明瞭如何透過指標重定向來存取資料以及雙重取消引用最終如何傳回原始資料值。
以上是Go 中「&」和「*」指標有什麼區別,什麼時候應該使用它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!