Use Since() instead of Now().Sub()

Metadata

ID: go-best-practices/time-now-sub

Language: Go

Severity: Info

Category: Best Practices

Description

Go’s time package provides functions and methods for working with dates and times. When calculating the duration between a specific time and the current time, it is recommended to use the time.Since(x) function instead of time.Now().Sub(x).

Here are a few reasons why:

  1. Readability: The time.Since(x) function conveys the intention of calculating the duration since a specific time x in a straightforward manner. It’s more readable and easier to understand than chaining time.Now().Sub(x), which requires reading the code from right to left.
  2. Performance: Using time.Since(x) avoids the unnecessary creation of an intermediate time.Time value with time.Now(). By directly calculating the time duration since x, you eliminate the overhead of the additional function call and improve performance.
  3. Consistency: The time.Since(x) function provides a consistent and idiomatic way of calculating the duration since a specific time. It follows the design principles of the standard library and promotes best practices for Go code.

For example, consider the following code snippets:

1
2
3
x := time.Date(2022, time.March, 20, 0, 0, 0, 0, time.UTC)
duration := time.Now().Sub(x)
fmt.Println(duration)

Output: The duration between the current time and March 20, 2022.

1
2
3
x := time.Date(2022, time.March, 20, 0, 0, 0, 0, time.UTC)
duration := time.Since(x)
fmt.Println(duration)

Output: The duration between the current time and March 20, 2022.

Both snippets achieve the same result, but the second one using time.Since(x) is preferred for its simplicity, readability, and performance.

By using time.Since(x) instead of time.Now().Sub(x), you can write more concise and idiomatic Go code, improving readability and maintaining consistency with the standard library.

Non-Compliant Code Examples

func main() {
    x := time.Now().Sub(x)
}

Compliant Code Examples

func main() {
    x := time.Since(x)
}
https://static.datadoghq.com/static/images/logos/github_avatar.svg https://static.datadoghq.com/static/images/logos/vscode_avatar.svg jetbrains

Seamless integrations. Try Datadog Code Analysis