应该在字符串格式中使用err.Error()吗?

This string formatting works just fine:

err := foo()
if err != nil {
  fmt.Printf("foo returned '%s' when called
", err)
}

Is there any merit do calling err.Error() in this context?

fmt.Printf("foo returned '%s" when called
", err.Error())

Both versions are completely fine.

The fmt package has special support for the error interface (scroll down a couple screens from this link):

  1. If an operand implements the error interface, the Error method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).

Your second version will probably run faster as it can avoid most of the special assertions the fmt package does, but the difference shouldn't be noticeable in most cases.

In general you should probably prefer the first version, which is more readable, especially with more arguments.

If err implements the Error interface, then the Error() method will be invoked implicitly when using a valid format verb such as %s. The documentation for fmt has more on this.