go - 覆盖 printf 方法

标签 go

我想创建一个函数,它的工作方式与 fmt.Printf 完全相同,但还用当前时间戳填充了字符串。理想情况下,我想覆盖 printf 和 println 来完成这项工作,但第一个解决方案也可以。

这是我所做的:

func output(message string, a ...interface{}) {
    fmt.Printf(getCurrentTime() + " " + message, a)
}

func getCurrentTime() string {
    t := time.Now()
    return t.Format("[2006-01-02 15:04:05]")
}

但是当我传递变量时它会输出奇怪的结果。

我应该怎么做?

最佳答案

如果你想将可变元素从一个函数传递到另一个函数,你必须扩展它们。在您的示例中,a 是一个 []interface,因此您只将两个参数传递给实际的 fmt.Printf:消息和一个数组。

你必须更正电话:

fmt.Printf(getCurrentTime() + " " + message, a...)

一个小例子来说明会发生什么:

func exec(args ...interface{}) {
    fmt.Println(args)
}

func insert(args ...interface{}) {
    exec(args)      // Prints [[5 42]]
    exec(args...)   // Prints [5 42]
}

func main() {
    insert(5, "42")
}

关于go - 覆盖 printf 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37469440/

相关文章:

go - 将 int 转换为指针?

firebase - 访问 HackerNews API

go - 编译 glide 销售包

mongodb - 如何编码/解码 mongodb 游标?

Golan 超范围接口(interface){}

go - Ticker 间隔更改的意外行为

go - 如何使用 kubernetes go-client 获取与 kubectl 提供的相同的 Pod 状态信息

mysql - 最新的 Mysql 和 Postgres 会自动准备每个查询吗?

arrays - Golang中如何返回未知类型的数组?

去缓冲 channel (容量4)接受5而不阻塞