ループ内で遅延を使用してリソースを適切に解放する
データベース操作では、メモリやシステム リソースのリークが発生しないように、使用後にリソースを解放することが不可欠です起こる。ループ内で defer ステートメントを使用する場合、そのような関数の実行がどのように処理されるかを理解することが重要です。
Go の仕様によれば、遅延関数は、囲んでいる関数が戻るかパニックしたときに実行されます。したがって、リソースがループ内で割り当てられ、遅延を使用して解放される場合、リソースはループの終了後にのみ解放されます。
リソースの解放を不必要に遅らせることを避けるために、リソース割り当てをラップすることをお勧めします。別の関数でコードをリリースします。これにより、パニックが発生した場合でも、リソースが不要になるとすぐに解放されることが保証されます。
for rows.Next() { func() { fields, err := db.Query(...) if err != nil { // Handle error and return return } defer fields.Close() // do something with `fields` }() }
このアプローチにより、リソースは即座に解放され、周囲のループが終了した場合でも解放されます。エラーまたはパニックが発生します。また、匿名関数からエラーを返すことで、エラーをより適切に処理することもできます:
func foo(rs *db.Rows) error { fields, err := db.Query(...) if err != nil { return fmt.Errorf("db.Query error: %w", err) } defer fields.Close() // do something with `fields` return nil }
その後、ループから関数を呼び出し、最初のエラーで終了することができます:
for rows.Next() { if err := foo(rs); err != nil { // Handle error and return return } }
さらに、Rows.Close() によって返されたエラーを確認したい場合は、別の匿名メソッドを使用できますfunction:
func foo(rs *db.Rows) (err error) { fields, err := db.Query(...) if err != nil { return fmt.Errorf("db.Query error: %w", err) } defer func() { if err = fields.Close(); err != nil { err = fmt.Errorf("Rows.Close() error: %w", err) } }() // do something with `fields` return nil }
これらのベスト プラクティスに従うことで、defer ステートメントを使用してループ内でリソースを適切に解放し、エラーを効果的に処理しながらメモリやリソースの潜在的なリークを防ぐことができます。
以上がGo ループで「defer」を使用してリソースのリリースを適切に管理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。