Go のエラー処理は、その単純さでよく知られています。それは、Go が非常に人気がある理由の 1 つでもあります。 Go の作成者は意図的に例外を回避し、代わりにエラー処理を明示的、追跡可能、予測可能にするシステムを選択しました。場合によっては、その単純さによって定型コードの繰り返しが発生し、最も経験豊富な開発者でさえイライラしてしまうことがあります。そこで、特定のシナリオでのエラー処理を簡素化するための、クリーンで慣用的な方法である 'Must' パターン が登場します。
このブログ投稿では、'Must' パターン を詳しく説明し、いつどのように使用するかを説明します。そしてもちろん、あなたの内なる Go ファンになるクールな例も紹介します。 (またはファンガール!)笑顔。行きましょう
「必須」パターン は単純な慣用句です。値とエラーを返す別の関数をラップする関数があります。エラーが nil ではないと仮定すると、ラッパーはパニックになります。 nil の場合、ラッパーは単に値を返します。
このパターンは、エラーが発生する可能性が低い場合、または失敗すべきではないセットアップ コードや構成など、実行を完全に停止する必要がある場合に優れています。この背後にあるアイデアは、可読性と機能性を犠牲にすることなくコードを読みやすくすることでした。
ここで「Must」パターンが真価を発揮します:
明確さ: 意図を明確にします。プログラムが動作するために絶対に失敗できないものがある場合、Must はそれを明確に伝えます。
定型文の削減: 面倒な繰り返しの if err!= nil { log.Fatal(err) } ブロックに別れを告げましょう!
初期化に適しています: テスト ヘルパー、ライブラリ API、および何か問題が発生した場合はすでに運命にある設定で便利です。
「Must」関数の構造
func Must[T any](val T, err error) T { if err != nil { panic(err) } return val }
詳しく見てみましょう:
必須: 関数名は、失敗が許されないことを示します。
T: Go のジェネリックスを使用すると、型に依存しない関数を作成できます。
パニック: エラーがある場合、プログラムは意味のあるエラー メッセージを表示して終了します。
package main import ( "encoding/json" "fmt" "os" ) func Must[T any](val T, err error) T { if err != nil { panic(err) } return val } type Config struct { Port int `json:"port"` Env string `json:"env"` } func main() { raw := Must(os.ReadFile("config.json")) var config Config Must(json.Unmarshal(raw, &config)) fmt.Printf("Loaded Config: %+v\n", config) }
?機能する理由: この設定により、構成ファイルが見つからないか破損している場合でも、プログラムは不正なデータでつまずくのではなく、ただちに停止します。
func Must[T any](val T, err error) T { if err != nil { panic(err) } return val }
? なぜ機能するのか: テンプレートの解析とサーバーの起動はクリティカル パスです。何かが失敗した場合、プログラムはまったく実行されないはずです。
package main import ( "encoding/json" "fmt" "os" ) func Must[T any](val T, err error) T { if err != nil { panic(err) } return val } type Config struct { Port int `json:"port"` Env string `json:"env"` } func main() { raw := Must(os.ReadFile("config.json")) var config Config Must(json.Unmarshal(raw, &config)) fmt.Printf("Loaded Config: %+v\n", config) }
? なぜ機能するのか: テストでは、失敗が発生するとすぐに実行を停止する必要があるため、Must は自然に適合します。
「必須」パターンはすべての状況に対応するわけではありません:
ランタイム エラー: 初期化/セットアップにのみ適用します。ランタイム操作の場合は、パニックを避けてエラーを適切に処理するようにしてください。
回復不可能なシナリオのみ: 失敗が回復できない状況 (必要なファイルのロードなど) には Must を使用します。
「必須」パターンは、信頼できるGoツールのようなもので、シンプル、効果的、信頼性が高くなります。これにより、Go の明示的なエラー処理の精神に違反することなく、ボイラープレートが排除され、意図が明確になり、コードの可読性が向上します。
賢く使用すると、コードがどれほどクリーンになったかを気に入るはずです。大きな力には大きな責任が伴うということを覚えておいてください。 Must を使いすぎるとデバッグの悪夢に変わる可能性があるため、慎重に使用してください。
さあ、慣用的な Go を書いてみましょう! ?
以上がGoMust パターン: エラー処理を合理化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。