2014-04-17 36 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