【问题标题】:How to wrap functions with "...interface{}" argument (like Printf)如何使用“...interface{}”参数包装函数(如 Printf)
【发布时间】:2025-11-30 11:30:01
【问题描述】:

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

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

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

但是当我这样称呼它时,由于某种原因,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]

在我看来,Log 中的 a 参数以某种方式进行了转换。我将如何以与直接调用 fmt.Println 相同的方式将 a 传递给 fmt.Println?

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我真的应该坐下来通读整个规范。
    • 澄清一下,当您执行fmt.Println(a) 时,您所做的是打印数组本身,因此Println 对其进行格式化以显示它是一个数组。当您执行fmt.Println(a...) 时,它会扩展为fmt.Println(a[0], a[1], a[2]) 等等,Println 将其视为值序列而不是数组。