【问题标题】:fmt.Printf() format specifier to print pointer to a struct in its default format?fmt.Printf() 格式说明符以默认格式打印指向结构的指针?
【发布时间】:2020-08-10 09:20:01
【问题描述】:

我的 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 中的文档不匹配。文档说,

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

【问题讨论】:

  • 您的示例代码显示您使用了%v,并且您得到了相同的输出。有什么问题?
  • @icza 更新了问题。我的程序的输出与fmt 文档相矛盾。我提供了文档的链接,并包含了相关的摘录以显示矛盾。

标签: pointers go struct format-specifiers


【解决方案1】:

您引用了fmt 包文档中的某些部分,但还不够“足够”。继续您的报价:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2023-03-20
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多