fmt.Printf() 格式说明符以默认格式打印指向结构的指针?

fmt.Printf() format specifier to print pointer to a struct in its default format?

我的 Go 代码:

package main

import (
    "fmt"
)

type Point struct {
    x int
    y int
}

func main() {
    fmt.Println(&Point{1, 2})
    fmt.Printf("%v\n", &Point{1, 2})
    fmt.Printf("%p\n", &Point{1, 2})
}

输出:

&{1 2}
&{1 2}
0xc00002c070

这与 https://godoc.org/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

根据上面的文档,对于指针,使用 %v 应该像使用 %p.

一样

为什么 fmt.Printf("%v\n", &Point{1, 2}) 的输出与 fmt.Printf("%p\n", &Point{1, 2}) 的输出不匹配?

您引用了 fmt 包文档的某些部分,只是“不够”。续引:

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[]

*Point 是指向结构的指针,因此使用 &{field0 field1 ...}.

打印

指向结构的指针在 Go 中很常见,并且大多数时候在打印它时您对指针值不感兴趣,而是对指向的结构(或指向的结构的字段)感兴趣。所以 fmt 包有一个规则来打印最想看到的内容。如果您确实需要地址,您可以像示例中那样使用 %p 打印它。