为什么这不会产生编译错误,这是golang中的错误还是我错过了什么?
intPadded := fmt.Sprintf("%09d", "i am a string" )
fmt.Println("bah" + intPadded)
执行时会给出
bah%!d(string=i am a string)
答案 0 :(得分:2)
这是你的错误。编译器只能检查fmt.Sprintf
参数是否具有正确的类型;所有类型都实现空接口。使用Go vet
命令。
func Sprintf(format string, a ...interface{}) string
Sprintf根据格式说明符格式化并返回 结果字符串。
接口类型指定称为其接口的方法集。一个 接口类型的变量可以使用方法存储任何类型的值 设置是接口的任何超集。据说这种类型 实现界面。
类型实现包含其方法的任何子集的任何接口 因此可以实现几个不同的接口。例如, 所有类型都实现空接口:
interface{}
Vet检查Go源代码并报告可疑构造,例如 其参数与格式字符串不对齐的Printf调用。
答案 1 :(得分:1)
"如果为动词提供了无效参数,例如向%d提供字符串,则生成的字符串将包含问题的描述"每http://golang.org/pkg/fmt/
它没有给出编译时错误,因为没有编译时错误。 fmt.Sprintf()
被定义为将...interface{}
用于其最后一个参数,该参数对任何类型的序列都有效。检查仅在运行时完成。