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

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

Dec 18, 2024 pm 09:56 PM

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 までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

See all articles