Heim  >  Artikel  >  Backend-Entwicklung  >  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
Mary-Kate OlsenOriginal
2024-11-01 03:24:28498Durchsuche

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>

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>

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!

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