type person struct{}
var tom *person = &person{}
当我使用
时fmt.Printf("%+v\n", tom)//prints:&{}
为什么结果是&加上数据?它是一个地址(0x0055)
当我使用
时fmt.Printf("%+v\n", &tom)//0x0038
fmt.Printf("%p\n", &tom)//0x0038
它给了我一个地址,它给了我0x0038,为什么%v和%p有相同的结果?
答案 0 :(得分:3)
tom
是指向person
的指针。当您使用&tom
时,您将创建第二个指针,这是指向人的指针。
在第一个示例中,您使用%+v
打印默认值tom
。默认值会使指针脱离并打印结构本身。
在您的第二个示例中,%+v
正在应用于" double"指针。它仍然会指向指针,进入初始指针。请参阅此示例:http://play.golang.org/p/IZThhkiQXM
答案 1 :(得分:0)
package main
import "fmt"
func zeroval(ival int) {
ival = 0
}
func zeroptr(iptr *int) {
*iptr = 0
}
func main() {
i := 1
fmt.Println("initial:", i)
zeroval(i)
fmt.Println("zeroval:", i)
//The &i syntax gives the memory address of i, i.e. a pointer to i.
zeroptr(&i)
fmt.Println("zeroptr:", i)
//Pointers can be printed too.
fmt.Println("pointer:", &i)
}
输出:
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100