栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

类似“ tail -f”的生成器

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

类似“ tail -f”的生成器

我建议围绕在EOF上运行的阅读器创建包装器:

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}

该阅读器可以在任何可以使用io.Reader的地方使用。这是使用bufio.Scanner循环行的方法:

t, err := newTailReader("somefile")if err != nil {    log.Fatal(err)}defer t.Close()scanner := bufio.NewScanner(t)for scanner.Scan() {    fmt.Println(scanner.Text())}if err := scanner.Err(); err != nil {    fmt.Fprintln(os.Stderr, "reading:", err)}

阅读器还可用于循环附加到文件的JSON值:

t, err := newTailReader("somefile")if err != nil {    log.Fatal(err)}defer t.Close()dec := json.NewDeprer(t)for {    var v SomeType    if err := dec.Depre(&v); err != nil {       log.Fatal(err)    }    fmt.Println("the value is ", v)}

与问题中概述的goroutine方法相比,这种方法有两个优点。首先是关机很容易。只需关闭文件。无需向goroutine发出退出信号的信号。第二个优点是许多软件包都可以与io.Reader一起使用。

可以调整睡眠时间,以满足特定需求。减少时间以降低延迟,并增加时间以减少CPU使用量。100ms的睡眠对于显示给人类的数据可能足够快。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484174.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号