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 协议》,转载必须注明作者和本文链接
power by GooseForum
文章
55
粉丝
16
喜欢
62
收藏
44
排名:502
访问:1.7 万
私信
所有博文
社区赞助商