如何在Go语言中打印结构体变量的地址

17

我刚开始学习go语言,想要打印出一个结构体变量的地址。以下是我的程序:

type Rect struct {
 width int
 name int 
}

func main() {
 r := Rect{4,6}
 p := &r
 p.width = 15

fmt.Println("-----",&p,r,p,&r)

}

这个的输出

  _____0x40c130 {15 6} &{15 6} &{15 6}

但我想打印r变量的地址,因为我知道'&'代表地址,'*'指向指针位置的值,但是我无法打印r的地址,在这里我正在使用go-lang在线编辑器https://play.golang.org/ 同时,我希望将此地址存储在某个变量中。

4
你尝试过使用fmt.Printf%p动词吗?(链接:https://play.golang.org/p/DpXgfJwsW63) - mkopriva
1个回答

44
当您使用 fmt.Println() 打印值时,将使用默认格式。引用自fmt包文档:

The default format for %v is:

bool:                    %t
int, int8 etc.:          %d
uint, uint8 etc.:        %d, %#x if printed with %#v
float32, complex64, etc: %g
string:                  %s
chan:                    %p
pointer:                 %p

For compound objects, the elements are printed using these rules, recursively, laid out like this:

struct:             {field0 field1 ...}
array, slice:       [elem0 elem1 ...]
maps:               map[key1:value1 key2:value2 ...]
pointer to above:   &{}, &[], &map[]

结构体值的地址是最后一行,因此它被特殊处理,并使用&{}语法打印。

如果您想打印其地址,请不要使用默认格式,而是使用格式化字符串并使用%p动词显式指定要获取地址(指针):

fmt.Printf("%p\n", &r)

这将输出以下内容(可以在Go Playground上尝试):
0x414020

我该如何将“0x414020”这个值存储到某个变量中? - Kiwi Rupela
3
请使用 s := fmt.Sprintf("%p", &r)。该代码行的功能是将变量 r 的内存地址格式化为一个字符串,并将其分配给变量 s。 - icza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接