2016-12-18 22 views
0

是否有一种方法可以在不输出任何内容的格式字符串中编写动词,即使有些值提供给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一样将它拉下来。

+2

请参阅[如何忽略fmt.Sprintf的额外字段](http://stackoverflow.com/questions/35043202/how-to-ignore-extra-fields-for-fmt-sprintf),它使用'fmt。 Sprintf()',但是很相似。它试图计算动词并用切片截断参数。它也反对使用动态格式字符串。 – e0k

+0

karmakaze的答案激励我尝试fmt的显式参数索引。如果你通过索引引用一个值,那么fmt不再抱怨额外的值。所以如果你为printf提供了多个值并且要求格式字符串至少代表其中的一个,那么格式字符串可以通过索引引用该强制值(例如'%[1] d'),并且不必担心其他值。 – Stein

回答

1

这可能不是你正在做的,重新寻找,但它值得看看text/template包。然后,您可以使用Parse("{{.Name}} items are made of {{.Material}}")定义模板并将其传递到Execute a map[string]string,其中包含密钥"Name""Material"。这还有一个好处,即格式字符串也可以排列值的输出顺序。

+0

一种更好的替代格式可能会让我头晕目眩,但我认为我会坚持一个简单的问题来开始。但这确实是我不知道的。我把它工作到[这个游乐场的例子](https://play.golang.org/p/jppr5Ew-xj)。虽然没有静态类型检查,但结构FooTalk可以内联,但我更愿意调用者清楚地看到他们可以访问的接口。 – Stein