ラッパー関数の可変個引数パラメーターの解明
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%!(EXTRA []interface {}=[]) というかなり予期せぬ出力が表示されます。このわかりにくい接尾辞は、可変個引数パラメーターの受け渡し方法に原因がある可能性があります。
設計上、可変個引数関数はそれぞれの型のスライスとして引数を受け取ります。この場合、Die 関数は args という名前の []interface{} スライスを受け入れます。ただし、その後この引数を fmt.Sprintf に渡すと、意図した個々の値ではなく、タイプ []interface{} の単一のエンティティとして扱われます。
これを修正するには、... 構文を次のようにする必要があります。以下に示すように採用されています:
str := fmt.Sprintf(format, args...)
このアプローチを使用すると、args 内の各値が別個の値として fmt.Sprintf に渡されることが保証されます。引数を使用して、Die 関数で受け取ったときの動作を模倣します。この重要な違いは Go 言語仕様に準拠しており、期待される出力を保証します。
以上がラッパー関数で可変引数パラメーターを使用すると、「fmt.Sprintf」が予期しない出力を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。