go - 你如何在 Go 中包装 var args?

标签 go

根据几个小组的帖子,以下代码应该可以工作:

package main

import "fmt"

func demo(format string, args ...interface{}) {
  var count = len(args)
  for i := 0; i < count; i++ {
    fmt.Printf("! %s\n", args[i])
  }
  fmt.Printf("%+v\n", format)
  fmt.Printf("%+v\n", args)
  fmt.Printf(format, args)
  fmt.Printf("\n")
}

func main() {
  demo("%s %d", "Hello World", 10)
  fmt.Printf("\n\n")
  demo("%d %s", 10, "Hello")
}

并产生“Hello World 10”和“10 Hello”,但它没有。相反,它产生:

! Hello World
! %!s(int=10)
%s %d
[Hello World 10]
[Hello World %!s(int=10)] %d(MISSING)


! %!s(int=10)
! Hello
%d %s
[10 Hello]
[10 %!d(string=Hello)] %s(MISSING)

也就是说,将 []interface{} 传递给以 ...interface{} 作为参数的函数不会扩展参数,而只是将其作为值传递。第一个 %s 将 []interface{} 扩展为一个字符串,并且不处理进一步的参数。

我敢肯定,在日志记录中一定有很多情况需要这样做;但我找不到有关如何操作的任何工作示例。

这基本上是 C 中的“vprintf”函数系列。

最佳答案

我不认为 OP 程序应该“有效”。也许这是故意的(?):

package main

import "fmt"

func demo(format string, args ...interface{}) {
        fmt.Printf(format, args...)
}

func main() {
        demo("%s %d\n\n", "Hello World", 10)
        demo("%d %s", 10, "Hello")
}

(还有 here


输出:

Hello World 10

10 Hello

关于go - 你如何在 Go 中包装 var args?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14730201/

相关文章:

Golang 可执行文件大小

pdf - 如何在golang中从PDF中提取纯文本

sql - 在插入或更新时返回数据时,我还需要使用 `Exec` 吗?

go - 在没有 Go 环境的情况下运行 go 程序

go - 通过函数分配Golang

go - 权限被拒绝使用 API key 从 GAE 使用 Go 访问 Bigquery

go - 为什么将值设置为结构作为映射中的值时会出现 "cannot assign"错误?

mongodb - 如何使用 ID 数组查询 mongodb

Golang 中的回调

go - 调用接口(interface)函数出错?