Go的标准库是一组增加和拓展语言的核心包。然而,很容易误用标准库,或者我们对其行为理解有限,导致产生了bug或不应该在生产级应用程序中某些功能。
1. 提供错误的持续时间
标准库提供了获取 time.Duration 的常用函数和方法,但由于 time.Duration 是 int64 的自定义类型,新手可能会因此感到困惑,进而导致提供错误的持续时间。比如,具有 Java 或 JavaScript 编程背景的开发者习惯传入数字类型。
为了说明这个常见的错误,让我们创建一个新的 time.Ticker,它每秒都会提供一个时钟信号:
ticker := time.NewTicker(1000)
for {select {case <-ticker.C:/ Do something}
}
如果运行这段代码,我们会发现这个时钟信号不是每秒发出的,而是每一微秒发出的。
由于 time.Duration 基于 int64 类型,上面这段代码传入 1000 是正确的,因为 1000是一个有效的int64 类型的数字。但是 time.Duration 表示两个瞬时时间之间的间隔,单位是纳秒。所以我们给 NewTicker 传入 1000 纳秒=1 微秒的持续时间。
这种错误经常发生,因为像Java 和 JavaScript 的标准库会让调用主提供以毫秒为单位的持续时间。
此外,如果我们想创建一个时间间隔为 1 微秒的 time.Ticker,那不应该直接传递一个 int64 类型的数字,而应使用 time.Duration 包中提供的 API&#