루프 내에서 연기를 사용한 적절한 리소스 릴리스
루프 내부에서 데이터베이스 쿼리
In 데이터베이스에 대한 SQL 쿼리를 작성해야 하는 루프인 경우 코드를 다음과 같이 구성할 수 있습니다. 다음은 다음과 같습니다.
for rows.Next() { fields, err := db.Query(.....) if err != nil { // ... } defer fields.Close() // do something with `fields` }
그러나 이러한 시나리오에서는 연기를 사용하여 리소스 릴리스를 처리하는 다양한 방법이 있습니다.
루프 외부로 연기 이동
한 가지 옵션은 다음과 같이 defer 문을 루프 외부로 이동하는 것입니다. 아래:
for rows.Next() { fields, err := db.Query(.....) if err != nil { // ... } // do something with `fields` } defer fields.Close()
익명 함수 활용
또 다른 접근 방식은 리소스 할당 코드를 익명 함수로 래핑하고 해당 함수 내에 defer 문을 배치하는 것입니다.
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() 오류 처리
Rows.Close()는 오류를 반환하므로 이를 확인하는 것이 좋습니다. 이는 익명 함수를 사용하여 수행할 수 있습니다.
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`를 사용하여 리소스 릴리스를 올바르게 관리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!