har*_*rry 1 string methods time pointers go
我不明白为什么下面的结果相同。我希望第一个结果是指针地址。
func print(t *time.Time) {
fmt.Println(t) // 2009-11-10 23:00:00 +0000 UTC m=+0.000000001 => it should be the address of t
fmt.Println(*t) // 2009-11-10 23:00:00 +0000 UTC m=+0.000000001
}
Run Code Online (Sandbox Code Playgroud)
因为使用fmt.Println()
进行打印,这意味着将应用默认格式。并引用以下软件包的文档fmt
:
除非使用动词%T和%p进行打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:
[...]
- 如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。
既然time.Time
有一个Time.String()
方法,指向它的指针*time.Time
也有一个:也有这个String()
方法。因此,fmt
程序包将其调用以生成*time.Time
值的字符串表示形式。
引用规格:方法集:
其他任何类型的方法集都
T
包含使用接收器类型声明的所有方法T
。对应的指针类型 的方法集*T
是使用Receiver*T
或声明T
T
的所有方法的集(也就是说,它也包含的方法集)。
总而言之,无论您是否打印time.Time
或*time.Time
值,String()
都将调用其方法,并且将使用/打印其返回的任何内容。