4

いくつかのグループの投稿によると、次のコードが機能するはずです。

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」ファミリーの関数です。

4

2 に答える 2

10

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")
}

こちらも


出力:

Hello World 10

10 Hello
于 2013-02-06T13:37:31.200 に答える
4

fmt.Printf(format, args...)あなたが思うようにすべきです。

于 2013-02-06T13:38:09.950 に答える