是否有一种方法可以在不输出任何内容的格式字符串中编写动词,即使有些值提供给Printf/Sprintf/Fprintf?换句话说,是否存在s
这个代码的输出值?在Go中忽略printf值
fmt.Printf(s, 42)
在C中,答案很简单:空字符串,因为the superfluous value is ignored。在Go中,空格式字符串会导致输出%!(EXTRA int=42)
。我认为这是一件好事,因为格式字符串很可能是错误的。在这种情况下,Python甚至会抛出“TypeError:并非在字符串格式化过程中转换的所有参数”。但是,如果我们真的想要吞噬,忽略,跳过,取消价值观,我们如何说服Printf我们的好意?
如果该值是一个字符串,它很简单:截为0:
fmt.Printf("nothing%.0s here", "foul")
你甚至可以在动词省略0,我挖a bash version of my question后实现。但如果价值是一个数字呢?
如果您想知道,为什么不简单省略多余的值:上下文是只有格式字符串可以被触摸,作为函数的参数。函数体为格式提供一些预定类型的值,如this simplified playground example。通常,传入的格式想要表示值,但有时您可能会忽略它。当然,这个函数可以长大并接受一个接口而不是一个格式字符串,但是我只是想知道Printf是否可以像它自己的C一样将它拉下来。
请参阅[如何忽略fmt.Sprintf的额外字段](http://stackoverflow.com/questions/35043202/how-to-ignore-extra-fields-for-fmt-sprintf),它使用'fmt。 Sprintf()',但是很相似。它试图计算动词并用切片截断参数。它也反对使用动态格式字符串。 – e0k
karmakaze的答案激励我尝试fmt的显式参数索引。如果你通过索引引用一个值,那么fmt不再抱怨额外的值。所以如果你为printf提供了多个值并且要求格式字符串至少代表其中的一个,那么格式字符串可以通过索引引用该强制值(例如'%[1] d'),并且不必担心其他值。 – Stein