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 协议》,转载必须注明作者和本文链接