你如何在Go中包装var args?

时间:2013-02-06 13:25:07

标签: 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")
}

并且收益&#34; Hello World 10&#34;和&#34; 10你好&#34;,但事实并非如此。相反,它产生:

! 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 {}传递给一个以...接口{}作为参数的函数不会扩展参数,而只是将其作为值传递。第一个%s将[] interface {}扩展为一个字符串,并且不再处理任何参数。

我确信在登录时必须有很多情况需要这样做;但我找不到任何有关如何做的实例。

这基本上是&#39; vprintf&#39; C语言中的一系列功能。

2 个答案:

答案 0 :(得分:9)

我不认为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

答案 1 :(得分:3)

fmt.Printf(format, args...)应该按照我的想法做到。