What is the correct format specifier to print error object in Go: %s or %v?
15,520
%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
.
Related videos on Youtube
Author by
Lone Learner
Updated on December 02, 2022Comments
-
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 theerror
object.I have two questions.
- Is there any scenario while printing errors where it would make a
difference for
%s
and%v
? - What is the correct format specifier to use in this case?
-
Volker almost 7 yearsUse %s (but please look up what %v and %s do in the package description of fmt).
-
Lone Learner almost 7 years@Volker I know what
%v
and%s
does. I would like to understand why you recommend%s
forerror
objects. Can you share the rationale please? -
Volker almost 7 yearsLess indirection. What gets printed is the output of the
Error()
method and that's a string: Clearer.
- Is there any scenario while printing errors where it would make a
difference for
-
Nathan Lutterman almost 5 yearsThe 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 almost 5 yearsAlso more discussion in this issue here: github.com/golang/go/issues/29934, which is somewhat relevant
-
Jeff Learman over 2 yearsIs 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.