我知道打印
int
我们可以使用 %d
,并且 string
我们可以使用 %s
但我们仍然可以使用 %v
来打印它们。那么如果我总是使用 %v
来打印它们呢?如果我这样做会发生什么问题?
不会发生任何不好的事情,但是
%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 打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:
如果操作数是reflect.Value,则操作数将被它所保存的具体值替换,并继续打印下一条规则。
如果操作数实现了Formatter接口,它将被调用。格式化程序提供对格式化的精细控制。
如果 %v 动词与 # 标志 (%#v) 一起使用并且操作数实现 GoStringer 接口,则将调用该接口。
如果格式(对于 Println 等隐式为 %v)对于字符串 (%s %q %v %x %X) 有效,则适用以下两个规则:
如果操作数实现了 error 接口,则会调用 Error 方法将对象转换为字符串,然后根据动词(如果有)的要求进行格式化。
如果操作数实现 String() 字符串方法,则将调用该方法将对象转换为字符串,然后根据动词(如果有)要求对其进行格式化。
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)
}