首页 > 后端开发 > Golang > 正文

如何在 Go 中创建'tail -f”等效项?

DDD
发布: 2024-10-30 03:33:02
原创
578 人浏览过

How to Create a

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(&amp;v); err != nil {
       log.Fatal(err)
    }
    fmt.Println("the value is ", v)
}</code>
登录后复制

优点

这种方法有几个优点:

  • 轻松关闭:只需关闭文件即可停止读取器。
  • 惯用的 Go 风格:它避免了对异步 goroutine 的需要,这对于此任务来说是不必要的。
  • 兼容性:包装器可以与任何期望的代码一起使用io.Reader。
  • 可配置的睡眠时间:可以调整睡眠间隔以优化延迟或 CPU 使用率。

以上是如何在 Go 中创建'tail -f”等效项?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!