我所知道的打印int,我们可以使用%d,并且string我们可以使用%s ,但我们仍然可以使用%v打印它们。那么,如果我总是习惯于%v打印它们怎么办?如果我这样做会发生什么问题?
int
%d
string
%s
%v
不会有什么不好的,但是%d动词指示fmt软件包打印为数字(以10为底),%v动词表示使用可以覆盖的 默认 格式。
fmt
请参阅以下示例:
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.Stringer
String() string
格式规则的完整列表位于的doc文件中fmt,并引用了相关部分:
除非使用动词%T和%p进行打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序: 如果操作数是reflect.Value,则将操作数替换为其所持有的具体值,然后使用下一个规则继续打印。 如果操作数实现了Formatter接口,则将调用它。Formatter提供了对格式的精细控制。 如果%v动词与#标志(%#v)一起使用,并且操作数实现GoStringer接口,则将调用该接口。 如果格式(对于Println等,隐式为%v)对于字符串(%s%q%v%x%X)有效,则以下两个规则适用: 如果操作数实现错误接口,则将调用Error方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。 如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。
除非使用动词%T和%p进行打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:
如果操作数是reflect.Value,则将操作数替换为其所持有的具体值,然后使用下一个规则继续打印。
如果操作数实现了Formatter接口,则将调用它。Formatter提供了对格式的精细控制。
如果%v动词与#标志(%#v)一起使用,并且操作数实现GoStringer接口,则将调用该接口。
如果格式(对于Println等,隐式为%v)对于字符串(%s%q%v%x%X)有效,则以下两个规则适用:
如果操作数实现错误接口,则将调用Error方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。
如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。