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 番目のスニペットが無効なのかという疑問が生じます。さらに、このような一時変数の使用を回避する方法はないのかと疑問に思うかもしれません。
この動作を理解する鍵は、「カンマ」にあります。わかりました」パターン。 Go では、マップにアクセスすると、結果は値のペアになります。キーに関連付けられた値と、キーがマップ内に存在するかどうかを示すブール値です。これは、欠落しているキーとゼロ値を区別するためによく使用されます。
最初のコード スニペットでは、all[id] 式は、それに割り当てられて存在する値のペアを返します。 return ステートメントはこれらの値を返します。
コンパイラーは、複数値の割り当てが有効かどうかを判断する役割を果たします。関数が複数の値を返しても、左側の受信者の変数が 1 つだけの場合、コンパイラはエラーを発行します。これは、コンパイラが返される値の数が、値を受け取る変数の数と一致することを期待しているためです。
2 番目のコード スニペットの場合、return all[id] 式は 1 つの値のみを返し、これは互換性がありません。左側の 2 つの変数を使用します。したがって、コンパイラはエラーを報告します。
残念ながら、Go 関数で複数の値を返すときに一時変数の使用を回避する方法はありません。これは、コンパイラが戻り値の数とそれを受け取る変数の数が一致することを必要とするためです。ただし、名前付き戻り値を使用するか、struct.
を返すことによって、一時変数の使用を最小限に抑えることができます。免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3