2013-07-25 25 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] 

這對我來說看起來像Log中的a參數會以某種方式進行轉換。我將如何通過與直接調用fmt.Println相同的方式將a傳遞給fmt.Println?

回答

10

只要改變fmt.Println(a)fmt.Println(a...)

參見 「傳遞參數給...參數」 中去規範http://golang.org/ref/spec#Passing_arguments_to_..._parameters

+3

謝謝。我真的應該坐下來仔細閱讀整個規範。 – Splitlocked

+3

只是爲了澄清一下,當你做'fmt.Println(a)'時,你正在做什麼,是在打印數組本身,所以'Println'格式化它以顯示它是一個數組。當你執行'fmt.Println(a ...)'時,它將被擴展爲'fmt.Println(a [0],a [1],a [2])'等等,其中'Println'被視爲一系列值而不是數組。 – joshlf