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