ホームページ > バックエンド開発 > Golang > ラッパー関数で可変引数パラメーターを使用すると、「fmt.Sprintf」が予期しない出力を生成するのはなぜですか?

ラッパー関数で可変引数パラメーターを使用すると、「fmt.Sprintf」が予期しない出力を生成するのはなぜですか?

Patricia Arquette
リリース: 2024-11-16 07:59:03
オリジナル
1009 人が閲覧しました

Why does `fmt.Sprintf` produce unexpected output when using a variadic parameter in a wrapper function?

ラッパー関数の可変個引数パラメーターの解明

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート