如何使用"... interface {}"参数包装函数(如Printf)

Spl*_*ked 11 go

在我当前的项目中,我正在尝试编写一个有条件地调用fmt.Println的日志记录函数.

我当前的Log函数如下所示:

func Log(level int, a ...interface{}) {
    if level <= LogLevel {
        fmt.Println(a)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我这样称它时,由于某种原因,Log的输出被括在括号中:

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]
Run Code Online (Sandbox Code Playgroud)

这对我看起来像aLog中的参数以某种方式被转换.我将如何以a与直接调用fmt.Println相同的方式传递给fmt.Println?

cth*_*m06 13

只需fmt.Println(a)改为fmt.Println(a...)

请参阅go规范中的"将参数传递给...参数" http://golang.org/ref/spec#Passing_arguments_to_..._parameters

  • 谢谢.我真的应该坐下来阅读整个规范一段时间. (4认同)
  • 只是为了澄清,你做什么时`fmt.Println(a)`正在打印数组本身,所以`Println`格式化它以显示它是一个数组.当你执行`fmt.Println(a ...)`时,它会扩展为`fmt.Println(a [0],a [1],a [2])`等等,其中'Println`视为一系列值而不是数组. (3认同)