2017-09-14 25 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