我的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
打印,如您的示例所示。