为什么不使用%v来打印int和string

问题描述 投票:0回答:2

我知道打印

int
我们可以使用
%d
,并且
string
我们可以使用
%s
但我们仍然可以使用
%v
来打印它们。那么如果我总是使用
%v
来打印它们呢?如果我这样做会发生什么问题?

string go formatting printf
2个回答
86
投票

不会发生任何不好的事情,但是

%d
动词指示
fmt
包以数字形式打印(使用基数 10),并且
%v
动词意味着使用可以覆盖的 default 格式.

看这个例子:

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
(如果指定了标志,可以进一步格式化)。

完整的格式化规则列表在

fmt
的包文档中,引用相关部分:

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

  1. 如果操作数是reflect.Value,则操作数将被它所保存的具体值替换,并继续打印下一条规则。

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

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

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

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

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


0
投票

GO lang 中使用的 %T 不使用 typeOf() 函数。 对于 typeOf() 函数,使用 reflect 包。

包主

导入( “FMMT” )

func main() {

var num int
var str string
var boolean bool
var flt float64

fmt.Printf("Type of num: %T\n", num)
fmt.Printf("Type of str: %T\n", str)
fmt.Printf("Type of boolean: %T\n", boolean)
fmt.Printf("Type of flt: %T\n", flt)

}

© www.soinside.com 2019 - 2024. All rights reserved.