我知道要打印int
我们可以使用%d
,string
我们可以使用%s
但我们仍然可以使用%v
来打印它们。那么如果我总是使用%v
来打印它们呢?如果我这样做会发生什么问题?
答案 0 :(得分:13)
没有什么不好的事情发生,但是<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="wait"><p>this is a div</p></div>
<div class="loder">Some Content</div>
动词指示打印的fmt
包是一个数字(使用基数10),而%d
动词意味着使用默认格式,可以覆盖。
见这个例子:
%v
输出(在Go Playground上尝试):
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)
}
使用2 *2*
动词时,%v
包检查该值是否实现了fmt.Stringer
接口(这是一个fmt
方法),如果是,那么将调用该方法将值转换为String() string
(如果指定了标志,则可以进一步格式化)。
格式规则的完整列表位于string
的包文档中,引用了相关部分:
除非使用动词%T和%p打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:
如果操作数是reflect.Value,则操作数将替换为它所拥有的具体值,并继续打印下一个规则。
如果操作数实现了Formatter接口,则会调用它。 Formatter可以很好地控制格式化。
- 醇>
如果%v动词与#flag(%#v)一起使用,并且操作数实现了GoStringer接口,那么将调用它。
如果格式(对于Println等隐式%v)对字符串有效(%s%q%v%x%X),则适用以下两条规则:
如果操作数实现了错误接口,则将调用Error方法将对象转换为字符串,然后根据动词的需要对其进行格式化(如果有的话)。
- 醇>
如果操作数实现方法String()字符串,则将调用该方法将对象转换为字符串,然后根据动词的需要对其进行格式化(如果有)。