>백엔드 개발 >Golang >데이터베이스를 쿼리할 때 루프에서 `defer`를 사용하여 리소스 릴리스를 올바르게 관리하는 방법은 무엇입니까?

데이터베이스를 쿼리할 때 루프에서 `defer`를 사용하여 리소스 릴리스를 올바르게 관리하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-26 06:59:13839검색

How to Properly Manage Resource Release with `defer` in Loops When Querying Databases?

루프 내에서 연기를 사용한 적절한 리소스 릴리스

루프 내부에서 데이터베이스 쿼리

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.