ホームページ >バックエンド開発 >Golang >Go で可変引数関数に渡すときに複数の戻り値を処理する方法は?

Go で可変引数関数に渡すときに複数の戻り値を処理する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-18 21:56:14831ブラウズ

How to Handle Multiple Return Values When Passing to Variadic Functions in Go?

可変引数関数による複数の戻り値

次のような複数の整数値を返す Go 関数があるとします。 >

直感的には、temp の結果を Printf に直接渡し、文字列フォーマットを使用して両方の値を出力します:
func temp() (int, int) {
    return 1, 1
}

ただし、このアプローチは機能しません。temp は 2 つの値を返すのに対し、Printf は 1 つの値しか期待しないためです。
fmt.Printf("first= %d and second = %d", temp())

この制限の理由は Go にあります。関数呼び出しの仕様。これは、関数に (Printf のように) 最終 ... パラメータがある場合、その関数には別の関数の残りの戻り値のみを割り当てることができると述べています。これは、他の関数には少なくとも 1 つの戻り値が必要であることを意味します。

文字列補間の使用

Printf を使用する代わりに、文字列補間を利用して目的を達成できます。

a, b := temp()
fmt.Println("first=", a, "and second =", b)
ラッピング返品値

Printf のような可変引数関数に複数の戻り値を渡すには、wrap と呼ばれるユーティリティ関数を利用できます。任意の数のインターフェイス{}値を受け取り、インターフェイス{}値のスライスを返します。

このユーティリティを使用すると、少なくとも 1 つの戻り値を持つ関数の戻り値を次の関数に渡すことができます。ラップして、結果のスライスを使用して Printf:
func wrap(vs ...interface{}) []interface{} {
    return vs
}

を呼び出します。ここで、oneInt、twoInts、threeStrings は単一の整数を返す関数です。
fmt.Printf("1: %v, 2: %v\n", wrap(oneInt())...)
fmt.Printf("1: %v, 2: %v\n", wrap(twoInts())...)
fmt.Printf("1: %v, 2: %v, 3: %v\n", wrap(threeStrings())...)

このアプローチでは、可変引数関数に戻り値を 1 つだけ渡すという制限が回避され、関数の複数の戻り値を必要に応じて出力できます。

以上がGo で可変引数関数に渡すときに複数の戻り値を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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