我不明白为什么下面的结果相同。 我希望第一个结果是指针地址。
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
}
答案 0 :(得分:5)
因为使用fmt.Println()
打印,这意味着将应用默认格式。并引用fmt
的软件包文档:
除了使用动词%T和%p进行打印时,特殊的格式注意事项适用于实现某些接口的操作数。按申请顺序:
[...]
- 如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。
由于time.Time
有一个Time.String()
方法,所以指向它的指针也有:*time.Time
也有这个String()
方法。因此fmt
包将其调用以产生*time.Time
值的字符串表示形式。
任何其他类型
T
的方法集由声明为接收者类型T
的所有方法组成。相应的pointer type*T
的方法集是用接收者*T
或T
声明的所有所有方法的集合(也就是说,它还包含T
)。
总而言之,无论您打印time.Time
还是*time.Time
值,都将调用其String()
方法,并使用或打印返回的任何内容。