Go で複数の値を返そうとすると、特定の構文が有効で他の構文が無効である理由がわかりにくいと思われるかもしれません。これを説明するために、次の 2 つのコード スニペットを考えてみましょう。
func FindUserInfo(id string) (Info, bool) { it, present := all[id] return it, present }
最初のコード スニペットは有効で、Info 値と bool 値の両方を返します。ただし、2 番目のスニペットは無効です:
func FindUserInfo(id string) (Info, bool) { return all[id] }
これにより、なぜ最初のスニペットが有効で 2 番目のスニペットが無効なのかという疑問が生じます。さらに、それや present のような一時変数の使用を回避する方法はないかと疑問に思うかもしれません。
この動作を理解する鍵は「カンマ」にあります。わかりました」パターン。 Go では、マップにアクセスすると、結果は値のペアになります。キーに関連付けられた値と、キーがマップ内に存在するかどうかを示すブール値です。これは、欠落しているキーとゼロ値を区別するためによく使用されます。
最初のコード スニペットでは、all[id] 式は、それに割り当てられて存在する値のペアを返します。次に、return ステートメントはこれらの値を返します。
コンパイラは、複数値の代入が有効かどうかを判断する役割を果たします。関数が複数の値を返しても、左側の受信者の変数が 1 つだけの場合、コンパイラはエラーを発行します。これは、コンパイラが返される値の数が、値を受け取る変数の数と一致することを期待しているためです。
2 番目のコード スニペットの場合、return all[id] 式は 1 つの値のみを返し、これは互換性がありません。左側の 2 つの変数を使用します。したがって、コンパイラはエラーを報告します。
残念ながら、Go 関数で複数の値を返すときに一時変数の使用を回避する方法はありません。これは、コンパイラーが戻り値の数とそれを受け取る変数の数が一致することを必要とするためです。ただし、名前付き戻り値を使用するか、構造体を返すことで、一時変数の使用を最小限に抑えることができます。
以上がGo 関数が複数の値を直接返せないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。