web-dev-qa-db-ja.com

Go —可変個引数関数パラメーターのパススルー

状況:

可変数の引数を取る単純な_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 [] interface {} = [])

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

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

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

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

40