ホームページ >バックエンド開発 >Golang >Go で可変長関数の引数を他の関数に渡すにはどうすればよいですか?

Go で可変長関数の引数を他の関数に渡すにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-11 19:54:02502ブラウズ

How do you pass variadic function arguments to other functions in Go?

可変個引数関数のパラメーター パススルーについて

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。