You should use fmt.Errorf("something %w", foo) instead of errors.New(fmt.Sprintf("something %s", foo)).
Here are a few reasons why:
Error wrapping: By using fmt.Errorf with the %w format specifier instead of %s, your new error object wraps the original error. This makes it possible to access the original error object using errors.Is and errors.As.
Simplicity: The fmt.Errorf function simplifies the error message creation by combining the formatting and error wrapping in one function call. In contrast, using errors.New(fmt.Sprintf("something %s", foo)) requires an extra step of formatting the string separately before creating the error.
Consistency: By consistently using fmt.Errorf, developers maintain a uniform approach to error handling and can easily recognize and handle errors throughout the codebase. Using a single idiomatic method rather than mixing different styles ensures consistency and improves code readability and maintainability.