我不明白为什么下面的结果是相同的。我预计第一个结果是指针地址。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
}
1 回答
扬帆大鱼
TA贡献1799条经验 获得超9个赞
因为您使用这fmt.Println()意味着将应用默认格式来打印它。并引用以下的包文档fmt:
除非使用动词 %T 和 %p 打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:
[...]
如果操作数实现 String() 字符串方法,则将调用该方法将对象转换为字符串,然后根据动词(如果有)的要求对其进行格式化。
既然time.Time有Time.String()方法,那么指向它的指针也有:*time.Time也有这个String()方法。因此,fmt包调用它来生成值的字符串表示形式*time.Time。
引用规范:方法集:
任何其他类型的方法集
T由使用接收者类型声明的所有方法组成T。对应指针类型 的方法集是用receiver或*T声明的所有方法的集合(即还包含)的方法集。*TTT
总而言之,无论您打印一个time.Time或一个*time.Time值,它的String()方法都会被调用,并且它返回的任何内容都将被使用/打印。
- 1 回答
- 0 关注
- 148 浏览
添加回答
举报
0/150
提交
取消
