2014-04-17 37 views
5
type person struct{} 
var tom *person = &person{} 

enter image description here如何正确打印出指针变量在golang

当我使用

fmt.Printf("%+v\n", tom)//prints:&{} 

为什么结果是&加上数据?这是surposed是一个地址(0x0055自)

当我使用

fmt.Printf("%+v\n", &tom)//0x0038 
fmt.Printf("%p\n", &tom)//0x0038 

它给了我一个地址,它给了我0x0038,为什么%v和%p具有相同的结果?

回答

3

tom是指向person的指针。当你使用&tom时,你是创建第二个指针,这是指向一个人的指针。

在第一个示例中,您使用%+v来打印默认值tom。默认值推迟指针并打印结构本身。

在第二个示例中,%+v应用于“double”指针。它仍然推迟指针,到达最初的指针。看到这个例子:http://play.golang.org/p/IZThhkiQXM

+0

所以指针值将自动deferenced? – user3505400

+0

当你使用%v时,是的。 –

+0

@VitorDeMario我困惑,请帮助我。我刚刚评论了一些行。 http://play.golang.org/p/cvfngZnYeC – alioygur

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