Maison > développement back-end > Golang > le corps du texte

Comment créer un équivalent \'tail -f\' dans Go ?

DDD
Libérer: 2024-10-30 03:33:02
original
579 Les gens l'ont consulté

How to Create a

Générateur de type "tail -f" dans Go

La tâche consiste à créer une fonction similaire au "tail -f" de Python qui fournit un flux continu de lignes à partir d'un fichier au fur et à mesure de leur écriture, sans bloquer le thread principal.

Solution originale

Le code Go fourni utilise une goroutine asynchrone pour constamment surveiller le fichier à la recherche de nouvelles lignes, ce qui soulève des inquiétudes quant au style Go idiomatique et à une complexité excessive potentielle.

Approche plus propre

Une approche Go plus simple et idiomatique consiste à créer un wrapper autour le lecteur de fichiers qui se met en veille uniquement lorsqu'il atteint la fin du fichier :

<code class="go">type tailReader struct {
    io.ReadCloser
}

func (t tailReader) Read(b []byte) (int, error) {
    for {
        n, err := t.ReadCloser.Read(b)
        if n > 0 {
            return n, nil
        } else if err != io.EOF {
            return n, err
        }
        time.Sleep(10 * time.Millisecond)
    }
}</code>
Copier après la connexion

Utilisation

Ce wrapper peut être utilisé partout où un io.Reader standard est attendu. Par exemple, pour parcourir des lignes à l'aide de bufio.Scanner :

<code class="go">t, err := newTailReader("somefile")
if err != nil {
    log.Fatal(err)
}
defer t.Close()
scanner := bufio.NewScanner(t)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}</code>
Copier après la connexion

Alternativement, le lecteur peut être utilisé pour des tâches plus complexes, telles que la gestion des valeurs JSON ajoutées :

<code class="go">t, err := newTailReader("somefile")
if err != nil {
    log.Fatal(err)
}
defer t.Close()
dec := json.NewDecoder(t)
for {
    var v SomeType
    if err := dec.Decode(&amp;v); err != nil {
       log.Fatal(err)
    }
    fmt.Println("the value is ", v)
}</code>
Copier après la connexion

Avantages

Cette approche offre plusieurs avantages :

  • Arrêt facile :La simple fermeture du fichier arrête le lecteur.
  • Style Go idiomatique : Il évite le besoin de goroutines asynchrones, qui peuvent être inutiles pour cette tâche.
  • Compatibilité : Le wrapper peut être utilisé avec n'importe quel code qui attend un io.Reader.
  • Temps de veille configurable : L'intervalle de veille peut être ajusté pour optimiser la latence ou l'utilisation du processeur.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!