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

时间:2016-12-15 08:02:19

标签: string go formatting printf

我知道要打印int我们可以使用%dstring我们可以使用%s 但我们仍然可以使用%v来打印它们。那么如果我总是使用%v来打印它们呢?如果我这样做会发生什么问题?

1 个答案:

答案 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打印,否则特殊格式注意事项适用于实现某些接口的操作数。按申请顺序:

     
      
  1. 如果操作数是reflect.Value,则操作数将替换为它所拥有的具体值,并继续打印下一个规则。

  2.   
  3. 如果操作数实现了Formatter接口,则会调用它。 Formatter可以很好地控制格式化。

  4.   
  5. 如果%v动词与#flag(%#v)一起使用,并且操作数实现了GoStringer接口,那么将调用它。

  6.         

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

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

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

    4.