Go语言 如何用“... interface{}”参数 Package 函数(如Printf)

t98cgbkg  于 2023-05-04  发布在  Go
关注(0)|答案(2)|浏览(116)

在我目前的项目中,我试图编写一个日志函数,它将有条件地调用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参数以某种方式进行了转换。我怎样才能将a传递给fmt.Println,与直接调用fmt.Println的方式相同呢?

9ceoxa92

9ceoxa921#

只需将fmt.Println(a)更改为fmt.Println(a...)
请参见“将参数传递给...参数”在go规范http://golang.org/ref/spec#Passing_arguments_to_..._parameters

nhjlsmyf

nhjlsmyf2#

最初的问题不是如何 Package 一个函数,使它看起来像Printf,而是如何调用这样的函数。但是逐字逐句地考虑原始问题的主题,我来这里寻找创建和维护 Package 器的提示。
如果您想知道如何科普go lint提供的一些功能,您可以声明使用printf样式格式化程序的自制函数,以便它检查您的格式语句和参数是否匹配。
比如说

func Infof(fmt string, args ...interface{}) {
    log.Printf("INFO"+fmt+"\n", args...)
}
func Warnf(fmt string, args ...interface{}) {
    log.Printf("WARN"+fmt+"\n", args...)
}

// this has a mistake, because there is no argument for %d    
Infof("Hello %s, can I help you with %d?", "Mark")

像这样跑去兽医;

go vet -printfuncs=InfoF,Warnf ./pkg/...

它会告诉您%d缺少一个参数。

相关问题