小编典典

为什么不使用%v打印int和字符串

go

我所知道的打印int,我们可以使用%d,并且string我们可以使用%s
,但我们仍然可以使用%v打印它们。那么,如果我总是习惯于%v打印它们怎么办?如果我这样做会发生什么问题?


阅读 316

收藏
2020-07-02

共1个答案

小编典典

不会有什么不好的,但是%d动词指示fmt软件包打印为数字(以10为底),%v动词表示使用可以覆盖的
默认 格式。

请参阅以下示例:

type MyInt int

func (mi MyInt) String() string {
    return fmt.Sprint("*", int(mi), "*")
}

func main() {
    var mi MyInt = 2
    fmt.Printf("%d %v", mi, mi)
}

输出(在Go Playground上尝试):

2 *2*

使用%v动词时,fmt程序包将检查该值是否实现fmt.Stringer接口(这是一个String() string方法),如果是,则将调用该方法将值转换为string(如果指定了标志,则可以进一步格式化)。

格式规则的完整列表位于的doc文件中fmt,并引用了相关部分:

除非使用动词%T和%p进行打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:

  1. 如果操作数是reflect.Value,则将操作数替换为其所持有的具体值,然后使用下一个规则继续打印。

  2. 如果操作数实现了Formatter接口,则将调用它。Formatter提供了对格式的精细控制。

  3. 如果%v动词与#标志(%#v)一起使用,并且操作数实现GoStringer接口,则将调用该接口。

如果格式(对于Println等,隐式为%v)对于字符串(%s%q%v%x%X)有效,则以下两个规则适用:

  1. 如果操作数实现错误接口,则将调用Error方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。

  2. 如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。

2020-07-02