これは一般的な苦情であり、いくつかの回答があります。
以下にいくつかの一般的なものを示します。
1 - 悪くない
これは、これらの苦情に対する非常に一般的な反応です。コードに数行の余分なコードがあるという事実は、実際にはそれほど悪いことではありません。ちょっと安っぽいタイピングで、読む側ではとても扱いやすいです。
2 - それは実際には良いことです
これは、これらの余分な行を入力して読み取ることは、実際にはその時点でロジックがエスケープされる可能性があり、その前の行に配置したリソース管理を元に戻す必要があることを非常によく思い出させるという事実に基づいています. これは通常、暗黙的な方法でロジックの流れを壊す可能性がある例外と比較して提起され、開発者は代わりに隠されたエラー パスを常に念頭に置いておく必要があります。少し前に、私はこれについてより詳細な暴言をここに書きました。
3 - パニック/回復を使用する
panic
特定の状況では、既知の型で使用し、recover
パッケージ コードが公開される直前に使用して、適切なエラーに変換し、代わりにそれを返すことで、その作業の一部を回避できます。この手法は、(un)マーシャラーなどの再帰的ロジックをアンロールするために最も一般的に見られます。
私は個人的に、これをあまり乱用しないように努めています。なぜなら、私はポイント 1 と 2 とより密接に関連しているからです。
4 - コードを少し整理する
状況によっては、繰り返しを避けるためにロジックを少し再編成することができます。
些細な例として、これは次のとおりです。
err := doA()
if err != nil {
return err
}
err := doB()
if err != nil {
return err
}
return nil
次のように編成することもできます。
err := doA()
if err != nil {
return err
}
return doB()
5 - 名前付きの結果を使用する
名前付きの結果を使用して、return ステートメントから err 変数を削除する人もいます。ただし、これを行うことはお勧めしません。これは、節約がほとんどできず、コードの明瞭さが低下し、1 つまたは複数の結果が救済の return ステートメントの前に定義されたときにロジックが微妙な問題を起こしやすくなるためです。
6 - if 条件の前にステートメントを使用する
以下のコメントで Tom Wilde がよく思い出したようにif
、Goのステートメントは条件の前に単純なステートメントを受け入れます。だからあなたはこれを行うことができます:
if err := doA(); err != nil {
return err
}
これは優れた Go イディオムであり、頻繁に使用されます。
いくつかの特定のケースでは、明確にするためにステートメントを独立させるために、この方法でステートメントを埋め込むことを避けたいと考えていますが、これは微妙で個人的なことです.