Maison > développement back-end > Golang > Comment puis-je créer un générateur de type « tail -f » dans Go ?

Comment puis-je créer un générateur de type « tail -f » dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-01 03:24:28
original
625 Les gens l'ont consulté

How Can I Create a

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

Problème

La queue d'un fichier dans Go nécessite une boucle avec un sommeil sur EOF, qui peut être sujet aux erreurs et inefficace. Existe-t-il une façon plus propre de procéder ?

Solution

Au lieu d'utiliser une goroutine, créez un wrapper autour d'un lecteur qui dort sur EOF :

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

func newTailReader(fileName string) (tailReader, error) {
    f, err := os.Open(fileName)
    if err != nil {
        return tailReader{}, err
    }

    if _, err := f.Seek(0, 2); err != nil {
        return tailReader{}, err
    }
    return tailReader{f}, nil
}</code>
Copier après la connexion

Utilisation

Ce lecteur peut être utilisé avec n'importe quel io.Reader, y compris bufio.Scanner et json.Decoder. Par exemple :

<code class="go">t, err := newTailReader(&quot;somefile&quot;)
if err != nil {
    log.Fatal(err)
}
defer t.Close()

// Use with bufio.Scanner
scanner := bufio.NewScanner(t)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

// Use with json.Decoder
dec := json.NewDecoder(t)
for {
    var v SomeType
    if err := dec.Decode(&amp;v); err != nil {
       log.Fatal(err)
    }
    fmt.Println(&quot;the value is &quot;, v)
}</code>
Copier après la connexion

Avantages

  • Arrêt facile : Fermez simplement le fichier.
  • Fonctionne avec de nombreux packages : De nombreux packages (comme bufio.Scanner et json.Decoder) fonctionnent avec io.Reader.
  • Veille configurable : Ajustez le temps de veille pour optimiser la latence ou 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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal