Heim > Backend-Entwicklung > Golang > Wie kann ich in Go einen „tail -f'-ähnlichen Generator erstellen?

Wie kann ich in Go einen „tail -f'-ähnlichen Generator erstellen?

Mary-Kate Olsen
Freigeben: 2024-11-01 03:24:28
Original
594 Leute haben es durchsucht

How Can I Create a

„tail -f“-ähnlicher Generator in Go

Problem

Das Tailing einer Datei in Go erfordert eine Schleife mit ein Ruhezustand auf EOF, der fehleranfällig und ineffizient sein kann. Gibt es eine sauberere Möglichkeit, dies zu tun?

Lösung

Anstatt eine Goroutine zu verwenden, erstellen Sie einen Wrapper um einen Reader, der auf EOF schläft:

<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>
Nach dem Login kopieren

Verwendung

Dieser Reader kann mit jedem io.Reader verwendet werden, einschließlich bufio.Scanner und json.Decoder. Zum Beispiel:

<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>
Nach dem Login kopieren

Vorteile

  • Einfaches Herunterfahren:Schließen Sie einfach die Datei.
  • Funktioniert mit vielen Paketen:Viele Pakete (wie bufio.Scanner und json.Decoder) funktionieren mit io.Reader.
  • Konfigurierbarer Ruhezustand:Passen Sie die Ruhezeit an, um die Latenz zu optimieren oder CPU-Auslastung.

Das obige ist der detaillierte Inhalt vonWie kann ich in Go einen „tail -f'-ähnlichen Generator erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage