Heim > Artikel > Backend-Entwicklung > Wie erstelle ich ein „tail -f“-Äquivalent in Go?
„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(&v); err != nil { log.Fatal(err) } fmt.Println("the value is ", v) }</code>
Vorteile
Dieser Ansatz bietet mehrere Vorteile:
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!