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

enter image description herecome stampare variabile puntatore correttamente in golang

Quando uso

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

Perché il risultato è & dati più? Si surposed ad essere un indirizzo (0x0055)

Quando utilizzo

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

Mi dà un indirizzo, mi dà 0x0038, perché% v e% p ha lo stesso risultato?

risposta

3

tom è un puntatore a person. Quando si utilizza &tom, si sta creando un secondo puntatore, questo un puntatore a un puntatore a una persona.

Nel primo esempio, si utilizza %+v per stampare il valore predefinito di tom. Il valore predefinito differisce il puntatore e stampa la struttura stessa.

Nel secondo esempio, %+v si applica al puntatore "doppio". Rimanda ancora il puntatore al puntatore iniziale. Vedere questo esempio: http://play.golang.org/p/IZThhkiQXM

+0

Così valore del puntatore verrà automaticamente deferenced? – user3505400

+0

Quando si utilizza% v, sì. –

+0

@VitorDeMario Mi confondo per favore aiutami. Ho appena commentato alcune righe. 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) 
} 

uscita:

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