2013-07-25 7 views
7

私の現在のプロジェクトでは、条件付きでfmt.Printlnを呼び出すロギング関数を記述しようとしています。"... interface {}"引数(Printfのような)で関数をラップする方法

私の現在のログ機能は、次のようになります。

func Log(level int, a ...interface{}) { 
    if level <= LogLevel { 
     fmt.Println(a) 
    } 
} 

しかし、私はこのようにそれを呼び出したときのログの出力は、何らかの理由で括弧に包まれます:

http://play.golang.org/p/Aa8vC54Ih0

package main 

import "fmt" 

var LogLevel int 

func main() { 
    fmt.Println("string", 10, 3.1415926) 
    LogLevel = 1 
    Log(1, "string", 10, 3.1415926) 
} 

func Log(level int, a ...interface{}) { 
    if level <= LogLevel { 
     fmt.Println(a) 
    } 
} 

string 10 3.1415926 
[string 10 3.1415926] 

これは私にはログのa引数が何とか変換されているように見えます。 aをfmt.Printlnに直接呼び出すのと同じ方法でfmt.Printlnに渡すにはどうすればいいですか?

答えて

10
+3

ありがとう行く仕様で "に...パラメータの引数を渡す" を参照してくださいfmt.Println(a)

fmt.Println(a...)に変更します。私は本当に座って、スペック全体をある程度読むべきです。 – Splitlocked

+3

'fmt.Println(a)'を実行しているときに何をしているのかを明確にするために、 'Println'はその配列を表示するようにフォーマットします。 'fmt.Println(a ...)'を実行すると 'fmt.Println(a [0]、a [1]、a [2])'などに展開され、 'Println'は配列ではなく値のシーケンス。 – joshlf

関連する問題