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。所以就比较好奇为什么输出不的一样。

fmt stringer 接口之谁动了我的 time.Duration

goland 中可以看到 Duration 实现了某些接口

同时也可以发现,此文件下有着格式化的代码。

fmt stringer 接口之谁动了我的 time.Duration

(当时我以为是语言特性,后来看到了fmt.Println才知道是fmt.Println实现了一些内部处理才使得在输出的时候调用了String())

原理是 fmt.Println() 在处理传入的数据时,会采用 type switch ,reflect 这一系列手法处理去处理不同的类型,同时如果发现传入的方法实现了 Stringer 这个接口,则会调用String()获取传入变量的内容。 挺方便的

本作品采用《CC 协议》,转载必须注明作者和本文链接
biubiubiu
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!