Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erstelle ich ein „tail -f“-Äquivalent in Go?

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

DDD
DDDOriginal
2024-10-30 03:33:02560Durchsuche

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>

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>

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>

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!

Stellungnahme:
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
Vorheriger Artikel:Warum hat Go kein Erbe?Nächster Artikel:Warum hat Go kein Erbe?