Maison  >  Article  >  développement back-end  >  Comment créer un équivalent \"tail -f\" dans Go ?

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

DDD
DDDoriginal
2024-10-30 03:33:02560parcourir

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>

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>

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>

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!

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