41

状況:

fmt.Fprintf可変数の引数を取る単純なラッパーを作成しようとしています。これはコードです:

func Die(format string, args ...interface{}) {
    str := fmt.Sprintf(format, args)
    fmt.Fprintf(os.Stderr, "%v\n", str)
    os.Exit(1)
}

問題:

で呼び出すとDie("foo")、次の出力が得られます (「foo」ではなく)。

foo%!(EXTRA []インターフェイス {}=​​[])

  • 「 foo 」の後に「 %!(EXTRA []interface {}=[]) 」があるのはなぜですか?
  • ラッパーを作成する正しい方法は何fmt.Fprintfですか?
4

1 に答える 1

62

可変個引数関数は、型のスライスとして引数を受け取ります。この場合、関数は[]interface{}名前付き を受け取りますargs。その引数をfmt.Sprintfに渡す場合、タイプ の単一の引数として渡します[]interface{}。本当に必要なのは、各値をargs個別の引数として (受け取ったのと同じ方法で) 渡すことです。これを行うには、...構文を使用する必要があります。

str := fmt.Sprintf(format, args...)

これは Go の仕様でも説明されています

于 2012-09-08T22:12:54.967 に答える