Go の可変個引数関数の概念により、関数は可変数の引数を受け入れることができます。ただし、これらの引数を他の関数に渡すときは、パラメーター展開を正しく処理することが重要です。
問題:
ラッパーとして機能する次の Die 関数を考えてみましょう。 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 {}=[])" が表示されます。
説明:
可変個引数関数は、引数を特定の型のスライスとして扱います。 Die 関数では、args は []interface{} 型のスライスです。 fmt.Sprintf に渡されると、個々の値は展開されず、[]interface{} 型の単一の引数として扱われます。
解決策:
渡すには個々の引数を正しく指定するには、... 構文を使用します:
str := fmt.Sprintf(format, args...)
これにより、引数スライスが拡張され、各値が個別の引数として渡されます。
追加情報:
Go 仕様では、この動作がさらに明確になっています。
「可変個引数関数の引数の型は、個々の引数の型のスライスです。可変個引数関数を呼び出すと、一連の引数からの暗黙的な変換が提供されます。スライス タイプに値を提供します。"
この概念を理解することで、他の関数に可変個引数を正しく渡し、予期しない出力を回避できます。
以上がGo で可変長関数の引数を他の関数に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。