在Go中打印错误对象的正确格式说明符是什么:%s或%v?

Lon*_*ner 6 error-handling string-formatting go

这是我的程序。

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
}
Run Code Online (Sandbox Code Playgroud)

这是输出。

error: Assertion failure; int: -1
error: Assertion failure; int: -1
Run Code Online (Sandbox Code Playgroud)

在此程序中,我使用%s还是%v打印error对象都没有区别。

我有两个问题。

  1. 在打印错误时是否有任何情况会影响%s%v
  2. 在这种情况下使用的正确格式说明符是什么?

小智 9

根据文档

%v  the value in a default format
...
%s  the uninterpreted bytes of the string or slice
Run Code Online (Sandbox Code Playgroud)

另外,有关以下内容的更多信息error

错误类型是接口类型。错误变量表示可以将自身描述为字符串的任何值。

因此,将其视为%s

  • 我想说的唯一可能令人困惑的是 Golang 团队在他们的博客中使用了 `%v`:https://blog.golang.org/error-handling-and-go。否则我认为也可以只使用 `%s`。 (5认同)
  • 在此问题上还有更多讨论:https://github.com/golang/go/issues/29934,这有点相关 (2认同)
  • @Nathan Lutterman `%v` 正确格式化 `&lt;nil&gt;` 错误。当错误为“nil”时,“%s”输出如下内容:“%!s(&lt;nil&gt;)” (2认同)