type person struct{}
var tom *person = &person{}
When I use
fmt.Printf("%+v\n", tom)//prints:&{}
Why the result is & plus data?It is surposed to be an address(0x0055)
When I use
fmt.Printf("%+v\n", &tom)//0x0038
fmt.Printf("%p\n", &tom)//0x0038
It gives me an address,it gives me 0x0038,why %v and %p has the same result?
In function byval , using pointer q ( *int ), which is a copy of pointer p ( *int ), integer *q ( i ) is set to a new int value 4143 . At the end before returning. the pointer q is set to nil (zero value), which has no effect on p since q is a copy.
You can print a pointer value using printf with the %p format specifier. To do so, you should convert the pointer to type void * first using a cast (see below for void * pointers), although on machines that don't have different representations for different pointer types, this may not be necessary.
You can also use the shorthand (:=) syntax to declare and initialize the pointer variables. The compiler will internally determine the variable is a pointer variable if we are passing the address of the variable using &(address) operator to it. Example: Go.
tom
is a pointer to a person
. When you use &tom
, you're a creating a second pointer, this a pointer to a pointer to a person.
In your first example, you're using %+v
to print the default value of tom
. The default value deferences the pointer and prints the struct itself.
In your second example, %+v
is applying to the "double" pointer. It still deferences the pointer, getting to the initial pointer. See this example: http://play.golang.org/p/IZThhkiQXM
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With