当字符串作为参数给%09d时,splangf的golang bug

时间:2014-03-30 13:05:26

标签: go printf

为什么这不会产生编译错误,这是golang中的错误还是我错过了什么?

intPadded := fmt.Sprintf("%09d", "i am a string" )
fmt.Println("bah" + intPadded)

执行时会给出

bah%!d(string=i am a string)

2 个答案:

答案 0 :(得分:2)

这是你的错误。编译器只能检查fmt.Sprintf参数是否具有正确的类型;所有类型都实现空接口。使用Go vet命令。

  

func Sprintf

     

func Sprintf(format string, a ...interface{}) string

     

Sprintf根据格式说明符格式化并返回   结果字符串。

     

Interface types

     

接口类型指定称为其接口的方法集。一个   接口类型的变量可以使用方法存储任何类型的值   设置是接口的任何超集。据说这种类型   实现界面。

     

类型实现包含其方法的任何子集的任何接口   因此可以实现几个不同的接口。例如,   所有类型都实现空接口:

interface{}
     

Command vet

     

Vet检查Go源代码并报告可疑构造,例如   其参数与格式字符串不对齐的Printf调用。

答案 1 :(得分:1)

"如果为动词提供了无效参数,例如向%d提供字符串,则生成的字符串将包含问题的描述"每http://golang.org/pkg/fmt/

它没有给出编译时错误,因为没有编译时错误。 fmt.Sprintf()被定义为将...interface{}用于其最后一个参数,该参数对任何类型的序列都有效。检查仅在运行时完成。