Wie erstelle ich ein „tail -f'-Äquivalent in Go?

DDD
Freigeben: 2024-10-30 03:33:02
Original
579 Leute haben es durchsucht

How to Create a

„tail -f“-ähnlicher Generator in Go

Die Aufgabe besteht darin, eine Funktion zu erstellen, die Pythons „tail -f“ ähnelt Bietet einen kontinuierlichen Strom von Zeilen aus einer Datei, während diese geschrieben werden, ohne den Haupt-Thread zu blockieren.

Originallösung

Der bereitgestellte Go-Code verwendet eine asynchrone Goroutine, um ständig Überwachen Sie die Datei auf neue Zeilen, was Bedenken hinsichtlich des idiomatischen Go-Stils und einer möglichen Überkomplikation aufwirft.

Saubererer Ansatz

Ein einfacherer und idiomatischerer Go-Ansatz besteht darin, einen Wrapper zu erstellen der Dateireader, der nur dann in den Ruhezustand wechselt, wenn das Ende der Datei erreicht ist:

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

Verwendung

Dieser Wrapper kann überall dort verwendet werden, wo ein Standard-io.Reader erwartet wird. Um beispielsweise Zeilen mit bufio.Scanner zu durchlaufen:

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

Alternativ kann der Reader für komplexere Aufgaben verwendet werden, wie zum Beispiel die Verarbeitung angehängter JSON-Werte:

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

Vorteile

Dieser Ansatz bietet mehrere Vorteile:

  • Einfaches Herunterfahren:Einfaches Schließen der Datei stoppt den Reader.
  • Idiomatischer Go-Stil: Es vermeidet die Notwendigkeit asynchroner Goroutinen, die für diese Aufgabe unnötig sein können.
  • Kompatibilität: Der Wrapper kann mit jedem erwarteten Code verwendet werden ein io.Reader.
  • Konfigurierbare Ruhezeit: Das Ruheintervall kann angepasst werden, um Latenz oder CPU-Auslastung zu optimieren.

Das obige ist der detaillierte Inhalt vonWie erstelle ich ein „tail -f'-Äquivalent in Go?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!