err.Error() 应该用于字符串格式化吗?

Should err.Error() be used in string formatting?

这种字符串格式工作得很好:

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

在这种情况下调用 err.Error() 有什么好处吗?

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

如果 err 实现了 Error 接口,那么在使用 %s 等有效格式动词时,将隐式调用 Error() 方法。 fmt 的文档对此有更多介绍。

两个版本都完全没问题。

fmt 包对错误接口有特殊支持(从 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).

您的第二个版本可能 运行 更快,因为它可以避免 fmt 包所做的大多数特殊断言,但在大多数情况下差异不应该很明显。

一般来说,您应该更喜欢第一个版本,它更具可读性,尤其是有更多参数。