いくつかのグループの投稿によると、次のコードが機能するはずです。
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」ファミリーの関数です。