Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-01 03:24:28498parcourir

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>

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>

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!

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