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
打印它。
我的 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
打印它。