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("somefile") 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(&v); err != nil { log.Fatal(err) } fmt.Println("the value is ", v) }</code>
Vorteile
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!