Go 中类似“tail -f”的生成器
任务是创建一个类似于 Python 的“tail -f”的函数,在写入文件时提供连续的行流,而不会阻塞主线程。
原始解决方案
提供的 Go 代码使用异步 goroutine 不断地监视文件中的新行,这会引发对惯用 Go 风格和潜在过度复杂化的担忧。
更简洁的方法
更直接、更惯用的 Go 方法包括创建一个包装器仅在到达文件末尾时才休眠的文件读取器:
<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>
用法
此包装器可以在任何需要标准 io.Reader 的地方使用。例如,要使用 bufio.Scanner 循环行:
<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>
或者,阅读器可用于更复杂的任务,例如处理附加的 JSON 值:
<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>
优点
这种方法有几个优点:
以上是如何在 Go 中创建'tail -f”等效项?的详细内容。更多信息请关注PHP中文网其他相关文章!