在上面的示例中,您将u定义为USER类型,但不是指向USER的指针.因此您需要&;u,因为json包中的Decode函数需要一个地址或指针.
如果像这样创建User实例:u:=new(User),它将是一个指针,因为新函数返回一个指针.您还可以创建一个指向如下用户的指针:var u*user.如果你做了这两件事中的任何一件,你就必须拿出通话中的&
来解码它才能工作.
指针基本上是保存地址的变量.当您将&;放在变量前面时,它会返回地址.*可以读作‘redirect of’.因此,当您像这样创建指针时:
变量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!")
}
}
希望这能有所帮助!