为什么打印time.Time和指向time.Time的指针具有相同的结果?

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)

icz*_*cza 5

因为使用fmt.Println()进行打印,这意味着将应用默认格式。并引用以下软件包的文档fmt

除非使用动词%T和%p进行打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:

[...]

  1. 如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。

既然time.Time有一个Time.String()方法,指向它的指针*time.Time也有一个:也有这个String()方法。因此,fmt程序包将其调用以生成*time.Time值的字符串表示形式。

引用规格:方法集:

其他任何类型的方法集都T包含使用接收器类型声明的所有方法T。对应的指针类型 的方法集*T使用Receiver *T或声明TT所有方法的集(也就是说,它也包含的方法集

总而言之,无论您是否打印time.Time*time.Time值,String()都将调用其方法,并且将使用/打印其返回的任何内容。