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



我的Go代码:

package main
import (
"fmt"
)
type Point struct {
x int
y int
}
func main() {
fmt.Println(&Point{1, 2})
fmt.Printf("%vn", &Point{1, 2})
fmt.Printf("%pn", &Point{1, 2})
}

输出:

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

这与中的文档不匹配https://godoc.org/fmt.文件显示,

%v的默认格式为:

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("%vn", &Point{1, 2})的输出与fmt.Printf("%pn", &Point{1, 2})的输出不匹配呢?

您引用了fmt包文档中的某些部分,只是没有"足够";。您报价的延续:

对于复合对象,元素是使用这些规则递归打印的,布局如下:

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

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

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

最新更新