Maison >développement back-end >Golang >Comment gérer correctement la libération des ressources avec « defer » dans les boucles lors de l'interrogation des bases de données ?

Comment gérer correctement la libération des ressources avec « defer » dans les boucles lors de l'interrogation des bases de données ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-26 06:59:13839parcourir

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

Libération appropriée des ressources avec report dans les boucles

Interrogation d'une base de données à l'intérieur d'une boucle

Dans une boucle dans laquelle vous devez effectuer des requêtes SQL sur une base de données, vous pouvez structurer votre code comme suit :

for rows.Next() {
   fields, err := db.Query(.....)
   if err != nil {
      // ...
   }
   defer fields.Close()

   // do something with `fields`

}

Cependant, il existe différentes manières de gérer la libération des ressources en utilisant le report dans de tels scénarios.

Déplacer le report en dehors de la boucle

Une option consiste à déplacer l'instruction defer en dehors de la boucle, comme indiqué ci-dessous :

for rows.Next() {
   fields, err := db.Query(.....)
   if err != nil {
      // ...
   }

   // do something with `fields`
}

defer fields.Close()

Utilisation Fonctions anonymes

Une autre approche consiste à envelopper le code d'allocation de ressources dans une fonction anonyme et à placer l'instruction defer dans cette fonction :

for rows.Next() {
    func() {
        fields, err := db.Query(...)
        if err != nil {
            // Handle error and return
            return
        }
        defer fields.Close()

        // do something with `fields`
    }()
}

Gestion des erreurs dans un fichier nommé Fonction

Vous pouvez également créer une fonction nommée pour gérer les erreurs reporting :

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
    }
}

Gestion de l'erreur Rows.Close()

Étant donné que Rows.Close() renvoie une erreur, vous souhaiterez peut-être la vérifier. Cela peut être fait à l'aide d'une fonction anonyme :

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
}

Conclusion

L'approche correcte pour libérer des ressources avec report en boucle dépend de vos besoins spécifiques et de votre gestion des erreurs exigences. En examinant attentivement les options présentées ci-dessus, vous pouvez assurer une bonne gestion des ressources et éviter les fuites de ressources.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn