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

enter image description hereWie golang richtig in Zeigervariable auszudrucken

Als ich

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

verwenden Warum das Ergebnis & plus Daten ist? Es surposed wird eine Adresse (0x0055)

zu sein

Wenn ich

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

Es gibt mir eine Adresse, es gibt mir 0x0038, warum% v und% p das gleiche Ergebnis hat?

Antwort

3

tom ist ein Zeiger auf eine person. Wenn Sie &tom verwenden, erstellen Sie einen zweiten Zeiger, einen Zeiger auf einen Zeiger auf eine Person. In Ihrem ersten Beispiel verwenden Sie %+v, um den Standardwert tom zu drucken. Der Standardwert beeinträchtigt den Zeiger und gibt die Struktur selbst aus. In Ihrem zweiten Beispiel gilt %+v für den "doppelten" Zeiger. Es verändert den Zeiger immer noch, indem er zum Anfangszeiger gelangt. Sehen Sie folgendes Beispiel: http://play.golang.org/p/IZThhkiQXM

+0

So Wertzeiger wird automatisch deferenced werden? – user3505400

+0

Wenn Sie% v verwenden, ja. –

+0

@VitorDeMario Ich verwirrt, bitte hilf mir. Ich habe nur ein paar Zeilen kommentiert. 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) 
} 

Ausgang:

$ go run pointers.go 
initial: 1 
zeroval: 1 
zeroptr: 0 
pointer: 0x42131100