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

enter image description hereJak wydrukować zmiennej wskaźnik prawidłowo golang

Gdy używam

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

Dlaczego wynik jest & dane Plus? Jest surposed być adres (0x0055)

Gdy używam

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

Daje mi adres, da mi 0x0038, dlaczego% v i% p ma taki sam wynik?

Odpowiedz

3

tom to wskaźnik do person. Gdy używasz &tom, tworzysz drugi wskaźnik, będący wskaźnikiem do wskaźnika do osoby.

W pierwszym przykładzie używasz %+v do drukowania domyślnej wartości tom. Domyślna wartość odradza wskaźnik i drukuje samą strukturę.

W twoim drugim przykładzie, %+v dotyczy "podwójnego" wskaźnika. Nadal odradza wskaźnik, przechodząc do początkowego wskaźnika. Zobacz poniższy przykład: http://play.golang.org/p/IZThhkiQXM

+0

więc wartość wskaźnika zostanie automatycznie deferenced? – user3505400

+0

Gdy używasz% v, tak. –

+0

@VitorDeMario Pomyliłem, proszę pomóż mi. Właśnie skomentowałem niektóre linijki. 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) 
} 

wyjściowa:

$ go run pointers.go 
initial: 1 
zeroval: 1 
zeroptr: 0 
pointer: 0x42131100 
Powiązane problemy