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 向下滚动几屏):
- 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 包所做的大多数特殊断言,但在大多数情况下差异不应该很明显。
一般来说,您应该更喜欢第一个版本,它更具可读性,尤其是有更多参数。
这种字符串格式工作得很好:
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 向下滚动几屏):
- 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 包所做的大多数特殊断言,但在大多数情况下差异不应该很明显。
一般来说,您应该更喜欢第一个版本,它更具可读性,尤其是有更多参数。