Maison  >  Article  >  développement back-end  >  Comment utiliser l'instruction defer de la fonction Golang lors de la fermeture d'un fichier

Comment utiliser l'instruction defer de la fonction Golang lors de la fermeture d'un fichier

WBOY
WBOYoriginal
2023-05-16 13:21:25663parcourir

Golang est un langage de programmation largement utilisé dans le développement Web. Il fournit une variété de types de données et de fonctionnalités de langage puissantes, rendant le codage plus efficace pendant le développement de projets. Une fonctionnalité très utile est l’instruction defer, qui est utilisée pour exécuter une section de code avant le retour de la fonction. Dans cet article, nous verrons comment utiliser l'instruction defer de la fonction Golang pour implémenter la fonction de fermeture de fichier et son application dans le développement réel.

Opérations sur les fichiers dans Golang

Dans Golang, les opérations sur les fichiers sont généralement effectuées à l'aide de fonctions du package os, telles que l'ouverture d'un fichier, la lecture du contenu d'un fichier, l'écriture de fichiers, etc. Parmi eux, la fonction os.Open() est utilisée pour ouvrir un fichier et renvoie un pointeur vers le fichier. Après avoir utilisé le fichier, nous devons généralement appeler manuellement la fonction Close() du fichier pour fermer le fichier afin de libérer les ressources système et d'éviter la perte de données. Voici un exemple d'opération de fichier de base :

package main

import (
    "os"
)

func main() {
    file, err := os.Open("example.txt")
    if err != nil {
        // 文件打开失败,进行错误处理
        return
    }
    defer file.Close() // 在函数返回前调用Close()函数,确保文件被关闭
    // TODO: 文件读取或写入操作
}

Dans le code ci-dessus, nous utilisons la fonction os.Open() pour ouvrir un fichier nommé example.txt et stocker le pointeur de fichier renvoyé dans la variable de fichier. Étant donné que le fichier peut rencontrer des problèmes en raison d'exceptions de lecture et d'écriture, nous devons gérer d'éventuelles erreurs dans la fonction. Afin d'éviter d'oublier de fermer le fichier ou qu'une exception se produit dans le programme et qu'il n'y a aucune chance d'exécuter la fonction Close(), nous utilisons l'instruction defer pour appeler la fonction Close() du fichier.

Comment implémenter la fermeture d'un fichier

Il est très simple d'utiliser l'instruction defer pour fermer le fichier. Il vous suffit d'ajouter la fonction Close() du fichier à l'instruction defer après l'ouverture du fichier. Lorsque la fonction exécute l'instruction return, le langage Go exécutera automatiquement l'instruction defer dans la fonction pour garantir que le fichier est fermé.

Il convient de noter qu'en raison du mécanisme d'exécution retardé des instructions defer, l'ordre d'exécution réel des instructions defer ajoutées à la fonction est dans l'ordre inverse. Par exemple, dans l'exemple suivant :

func main() {
    file1, _ := os.Open("example.txt")
    defer file1.Close()
    file2, _ := os.Open("example2.txt")
    defer file2.Close()
    // ...
}

Bien que nous ayons ouvert example.txt d'abord, puis example2.txt, puisque l'instruction defer sera exécutée dans l'ordre inverse, example2.txt sera fermé avant example.txt. Et si nous fusionnons les instructions defer ensemble, nous pouvons garantir l'ordre d'exécution de la fonction Close() :

func main() {
    file1, _ := os.Open("example.txt")
    file2, _ := os.Open("example2.txt")
    defer func() {
        file1.Close()
        file2.Close()
    }()
    // ...
}

Dans le code ci-dessus, nous avons fusionné les fonctions Close() de file1 et file2 en une fonction anonyme, et dans ce A L'instruction defer a été ajoutée à la fonction. Puisque la fonction anonyme est exécutée en dernier, nous garantissons l'ordre d'exécution de la fonction Close() via cette méthode, évitant ainsi les problèmes causés par l'ordre d'appel de la fonction Close().

Scénarios d'application

Dans le développement réel, la fermeture de fichiers à l'aide de l'instruction defer est largement utilisée. Surtout lors de la lecture, de l'écriture, de la copie et d'autres opérations de fichiers, ne pas fermer le fichier entraînera un gaspillage de ressources système et peut également entraîner une perte de données. Voici quelques scénarios d'application courants :

  1. Lecture de fichiers : pour les tâches qui nécessitent la lecture d'un grand nombre de fichiers, vous devez vous rappeler de fermer le fichier à chaque fois que vous l'ouvrez. Car à chaque fois qu'un fichier est ouvert, les ressources système seront occupées. Si elles ne sont pas libérées à temps, les ressources système seront insuffisantes.
func readFiles(filenames []string) {
    for _, filename := range filenames {
        file, err := os.Open(filename)
        if err != nil {
            // 处理错误
            return
        }
        defer file.Close()
        // 文件读取操作
    }
}
  1. Écriture de fichier : lorsque vous effectuez une opération d'écriture de fichier, vous devez d'abord créer un nouveau fichier, puis écrire les données. Une fois l'écriture terminée, n'oubliez pas de fermer le fichier pour vous assurer que l'écriture des données est terminée et que les ressources système sont libérées à temps.
func writeFile(filename string, data []byte) {
    file, err := os.Create(filename)
    if err != nil {
        // 处理错误
        return
    }
    defer file.Close()
    _, err = file.Write(data)
    if err != nil {
        // 处理错误
        return
    }
}
  1. Copie de fichier : lorsque vous effectuez une opération de copie de fichier, vous devez ouvrir le fichier source, lire les données dans le fichier source et les écrire dans le nouveau fichier cible. Une fois la copie terminée, n'oubliez pas de fermer le fichier.
func copyFile(srcFile, destFile string) {
    src, err := os.Open(srcFile)
    if err != nil {
        // 处理错误
        return
    }
    defer src.Close()
    dest, err := os.Create(destFile)
    if err != nil {
        // 处理错误
        return
    }
    defer dest.Close()
    _, err = io.Copy(dest, src)
    if err != nil {
        // 处理错误
        return
    }
}

Dans le développement réel, nous pouvons combiner les scénarios d'application ci-dessus et les instructions différées et utiliser les puissantes fonctionnalités fournies par Golang pour effectuer diverses opérations sur les fichiers.

Conclusion

L'instruction defer de Golang est une fonctionnalité de langage très utile. Certains codes qui doivent être exécutés avant le retour de la fonction peuvent être implémentés via l'instruction defer. Dans les opérations sur les fichiers, l'utilisation de l'instruction defer pour fermer le fichier peut garantir que le fichier est fermé à temps et éviter le gaspillage de ressources et la perte de données. Dans le développement réel, nous devons combiner le scénario d'application et les caractéristiques de l'instruction defer pour effectuer diverses opérations de fichiers complexes en écrivant du code de haute qualité.

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
Article précédent:inversion du contrôle GolangArticle suivant:inversion du contrôle Golang