3 回答

TA貢獻1829條經驗 獲得超7個贊
在上面的示例中,您將 u 定義為 User 類型,但不是指向 User 的指針。所以你需要 &u 是因為 json 包中的 Decode 函數需要一個地址或指針。
如果您像這樣創建 User 的實例: u := new(User) 它將是一個指針,因為 new 函數返回一個指針。你也可以像這樣創建一個指向用戶的指針:var u *User。如果您執行了其中任何一項操作,則必須&在對 Decode 的調用中刪除才能使其工作。
指針基本上是保存地址的變量。當您將 & 放在變量前面時,它會返回地址。* 可以讀作'redirect of'。因此,當您創建這樣的指針時:
var x *int
這可以理解為 x 將重定向到一個 int。當你給 x 賦值時,你會給它一個這樣的地址: y := 10 x = &y
其中 y 是一些整數。因此,如果您要打印 x,您將獲得 y 的地址,但是如果您打印 *x,您將重定向到 x 指向的 y 值是 10。如果您要打印 &x,您將獲得指針 x 本身的地址。
如果你試圖打印出 *y,它只是一個 int,而不是一個指針,它會拋出一個錯誤,因為你將使用一些不是要重定向到的地址的值進行重定向。
運行下面的一些指針樂趣:
package main
import "fmt"
func main() {
var y int
var pointerToY *int
var pointerToPointerToInt **int
y = 10
pointerToY = &y
pointerToPointerToInt = &pointerToY
fmt.Println("y: ", y)
fmt.Println("pointerToY: ", pointerToY)
fmt.Println("pointerToPointerToInt: ", pointerToPointerToInt)
fmt.Println("&y: ", &y) // address of y
fmt.Println("&pointerToY: ", &pointerToY)// address of pointerToY
fmt.Println("&pointerToPointerToInt: ", &pointerToPointerToInt) // address of pointerToPointerToInt
// fmt.Println(*y) throws an error because
// you can't redirect without an address..
// y only has int value of 10
fmt.Println("*pointerToY: ", *pointerToY) // gives the value of y
fmt.Println("*pointerToPointerToInt: ", *pointerToPointerToInt) // gives the value of pointerToY which is the address of y
fmt.Println("**pointerToPointerToInt: ", **pointerToPointerToInt) // this gives 10, because we are redirecting twice to get y
if pointerToY == *pointerToPointerToInt {
fmt.Println("'pointerToY == *pointerToPointerToInt' are the same!")
}
if pointerToY == &y {
fmt.Println("'pointerToY == &y' are the same!")
}
if &pointerToY == pointerToPointerToInt {
fmt.Println("'&pointerToY == pointerToPointerToInt' are the same!")
}
if y == **pointerToPointerToInt {
fmt.Println("'y == **pointerToPointerToInt' are the same!")
}
if pointerToY == *pointerToPointerToInt {
fmt.Println("'pointerToY == *pointerToPointerToInt' are the same!")
}
}
希望這可以幫助!

TA貢獻1951條經驗 獲得超3個贊
我會引用一位聰明的家伙的話:
變量名前面的 & 用于檢索該變量值的存儲地址。該地址是指針將要存儲的地址。
* 在類型名稱之前,表示聲明的變量將存儲該類型的另一個變量的地址(不是該類型的值)。
* 在指針類型的變量前面用于檢索存儲在給定地址的值。在 Go 語言中,這稱為取消引用。
來源:http : //piotrzurek.net/2013/09/20/pointers-in-go.html

TA貢獻1744條經驗 獲得超4個贊
顯示代碼執行順序的簡單示例。
import (
"fmt"
)
func main() {
x := 0
fmt.Println("Step 1", x)
foo(&x)
fmt.Println("Step 4", x)
}
func foo(y *int) {
fmt.Println("Step 2", *y)
*y = 100
fmt.Println("Step 3", *y)
}
/*
Steps Result
1 0
2 0
3 100
4 100
*/
- 3 回答
- 0 關注
- 242 瀏覽
添加回答
舉報