What is the correct format specifier to print error object in Go: %s or %v?

15,520

According to docs:

%v  the value in a default format
...
%s  the uninterpreted bytes of the string or slice

Also, more information about error:

The error type is an interface type. An error variable represents any value that can describe itself as a string.

So, treat it as %s.

Share:
15,520

Related videos on Youtube

Lone Learner
Author by

Lone Learner

Updated on December 02, 2022

Comments

  • Lone Learner
    Lone Learner over 1 year

    Here is my program.

    package main
    
    import (
        "errors"
        "fmt"
    )
    
    func main() {
        a := -1
        err := assertPositive(a)
        fmt.Printf("error: %s; int: %d\n", err, a)
        fmt.Printf("error: %v; int: %d\n", err, a)
    }
    
    func assertPositive(a int) error {
        if a <= 0 {
            return errors.New("Assertion failure")
        }
        return nil
    }
    

    Here is the output.

    error: Assertion failure; int: -1
    error: Assertion failure; int: -1
    

    In this program, it makes no difference whether I use %s or %v to print the error object.

    I have two questions.

    1. Is there any scenario while printing errors where it would make a difference for %s and %v?
    2. What is the correct format specifier to use in this case?
    • Volker
      Volker almost 7 years
      Use %s (but please look up what %v and %s do in the package description of fmt).
    • Lone Learner
      Lone Learner almost 7 years
      @Volker I know what %v and %s does. I would like to understand why you recommend %s for error objects. Can you share the rationale please?
    • Volker
      Volker almost 7 years
      Less indirection. What gets printed is the output of the Error() method and that's a string: Clearer.
  • Nathan Lutterman
    Nathan Lutterman almost 5 years
    The only thing that I'd say is perhaps confusing about this is that the Golang team uses %v in their blogs: blog.golang.org/error-handling-and-go. Otherwise I think it's probably okay to just use %s as well.
  • Nathan Lutterman
    Nathan Lutterman almost 5 years
    Also more discussion in this issue here: github.com/golang/go/issues/29934, which is somewhat relevant
  • Jeff Learman
    Jeff Learman over 2 years
    Is it worth mentioning the special handling for format strings ending in ": %s" followed by an error? That's very non-intuitive (if it was retained in the language; I'm not sure.) See @NathanLutterman's citation.