Error Wrapping Uses Wrong Format Verb

non-wrapping format verb for fmt.Errorf. Use `%w` to format errors (errorlint)

Quick Answer

Use %w instead of %v or %s in fmt.Errorf to properly wrap errors. Only %w allows errors.Is and errors.As to unwrap the chain.

Why This Happens

fmt.Errorf with %v converts the error to a string, losing the error chain. Using %w wraps the original error so that errors.Is() and errors.As() can still find it. This is essential for proper error handling in Go 1.13+.

The Problem

func readConfig(path string) error {
    data, err := os.ReadFile(path)
    if err != nil {
        return fmt.Errorf("failed to read config: %v", err) // loses error chain
    }
    _ = data
    return nil
}

The Fix

func readConfig(path string) error {
    data, err := os.ReadFile(path)
    if err != nil {
        return fmt.Errorf("failed to read config: %w", err) // preserves error chain
    }
    _ = data
    return nil
}

Step-by-Step Fix

  1. 1

    Identify %v with errors

    Find fmt.Errorf calls that format errors with %v or %s instead of %w.

  2. 2

    Replace with %w

    Change the format verb to %w to wrap the error properly.

  3. 3

    Verify unwrapping

    Test that errors.Is() and errors.As() work correctly with the wrapped error.

Got the actual stack trace?

Paste it into our free AI explainer to get the cause and the fix for your specific case — no signup, nothing to install.

Explain my error

Bugsly catches this automatically

Bugsly's AI analyzes this error pattern in real-time, explains what went wrong in plain English, and suggests the exact fix — before your users even report it.

Try Bugsly free