2016-12-18 20 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