2012-09-08 49 views
20

我想寫簡單fmt.Fprintf包裝物採用可變數目的參數,這裏是代碼:圍棋 - 可變參數函數的參數直通

func Die(format string, args ...interface{}) { 
    str := fmt.Sprintf(format, args) 
    fmt.Fprintf(os.Stderr, "%v\n", str) 
    os.Exit(1) 
} 

但是當我打電話吧:

Die("foo")

我得到:

foo%!(EXTRA []interface {}=[])

不知道爲什麼我在「foo」之後得到這個文本&什麼是創建fmt.Fprintf包裝的正確方法?

+3

順便說一句,Die功能重新實現了[log.Fatal](http://golang.org/pkg/log/#Fatal)和/或[log.Logger.Fatalf](http:// golang。 org/pkg/log /#Logger.Fatalf)已準備就緒。 – zzzz

回答

35

變量函數接收參數作爲類型的一個片段。在這種情況下,您的功能將收到名爲args[]interface{}。當您將該參數傳遞給fmt.Sprintf時,您將它作爲類型爲[]interface{}的單個參數傳遞。你真正想要的是將args中的每個值作爲單獨的參數傳遞(與接收它們的方式相同)。爲此,您必須使用...語法。

str := fmt.Sprintf(format, args...) 

這也在Go規範here中有解釋。