2017-09-14 63 views
0

我想寫一個包裝FPrintf的功能,但我不斷收到怪異的字符。如何在Go中打包FPrintf?

下面是一個再現

https://play.golang.org/p/yZgNnpovEa

的想法是能夠有一個條件printf的,我可以測試輸出(因此使用fprintf中的,所以我可以測試朝着輸入輸出)。有什麼辦法可以解決這個問題嗎?

我看過How to ignore extra fields for fmt.Sprintf但是所有的答案都假設用戶只期待%s,而在我的情況下,我希望像Printf一樣靈活,並且唯一的另一個是downvoted。

這是不可能的,任何人都可以給出合理的解釋,爲什麼?

+6

答案是一樣的,你鏈接的問題,你就錯過了'...'擴大'params'片。 – JimB

+2

另請參閱https://stackoverflow.com/questions/23723955/how-can-i-pass-a-slice-as-a-variadic-input – JimB

+0

哇,我應該回到編程學校。謝謝。 Ofc我需要擴展參數 – ByteFlinger

回答

0

問題是你實際上發送一個空片到fmt.Fprintf。 Params'長度的額外檢查應該可以解決問題。

func (p ConditionalPrinter) printF(s string, params ...interface{}) { 
    if p.print { 
     if len(params) == 0 { 
      fmt.Fprintf(p.writer, s) 
     } else { 
      fmt.Fprintf(p.writer, s, params) 
     } 
    } 
} 

或者這樣:

func (p ConditionalPrinter) printF(s string, params ...interface{}) { 
    switch {   
    case !p.print: 
     return 
    case len(params) == 0: 
     fmt.Fprintf(p.writer, s) 
    default: 
     fmt.Fprintf(p.writer, s, params) 
    } 
} 

Playground link