fmt stringer 接口之谁动了我的 time.Duration
昨天写代码用了下属代码记录程序运行时间。中间记录有些问题就用 fmt.Println()调试了一下。结果发现输出被格式化了。
var start time.Time
func InitStart() {
start = time.Now()
}
func GetRunTime() time.Duration {
return time.Now().Sub(start)
}
func main(){
fmt.Println(GetRunTime())
}
2.818208ms
因为 time.Duration 本身为 type Duration int64。所以就比较好奇为什么输出不的一样。

从 goland 中可以看到 Duration 实现了某些接口
同时也可以发现,此文件下有着格式化的代码。

(当时我以为是语言特性,后来看到了fmt.Println才知道是fmt.Println实现了一些内部处理才使得在输出的时候调用了String())
原理是 fmt.Println() 在处理传入的数据时,会采用 type switch ,reflect 这一系列手法处理去处理不同的类型,同时如果发现传入的方法实现了 Stringer 这个接口,则会调用String()获取传入变量的内容。 挺方便的
本作品采用《CC 协议》,转载必须注明作者和本文链接
power by GooseForum
关于 LearnKu
推荐文章: