如何在golang中正确打印指针变量

时间:2014-04-17 15:50:15

标签: pointers go

type person struct{}
var tom *person = &person{}

enter image description here

当我使用

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

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

当我使用

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

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

2 个答案:

答案 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