我不明白为什么下面的结果是相同的。我预计第一个结果是指针地址。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
声明的所有方法的集合(即还包含)的方法集。*T
T
T
总而言之,无论您打印一个time.Time
或一个*time.Time
值,它的String()
方法都会被调用,并且它返回的任何内容都将被使用/打印。
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报
0/150
提交
取消