//f.Seek(0, 2)

来源:2-3 读取模块实现

小月肖

2018-04-23 22:00

出错了出错了,注释掉就没事了,centos 7.0

读取时err会等于EOF

写回答 关注

6回答

  • A_小颖
    2018-04-23 22:52:49
    已采纳

    我这里正常,具体报什么错?把错误信息贴出来呗。

  • _潇潇暮雨
    2018-06-10 11:04:05

    最后一个字节吧

  • 小月肖
    2018-04-23 23:48:57

    如果一开始有数据  seek直接读取到末尾如果文件为空需要先将\n读取

    小月肖 回复麦可同学

    是将指针移到整个文件的最后吗? 不是移到某一行的最后吗

    2018-04-24 19:03:39

    共 4 条回复 >

  • 小月肖
    2018-04-23 23:27:13

    我一开始文件里面是有数据的


    A_小颖

    对啊,程序会一直读取文件内容,直到末尾,如果没有新增的日志数据,肯定会返回io.EOF,这时需要等待新的日志产生。

    2018-04-23 23:34:10

    共 1 条回复 >

  • A_小颖
    2018-04-23 23:15:15

    这是正常的把,err==io.EOF 是处理文件到末尾的情况,然后再需要等待日志继续产生。

  • 小月肖
    2018-04-23 23:06:55
    func (r *ReadFromFile) Read(rc chan []byte) {
       //读取数据
    
       f, err := os.Open(r.path)
       if err != nil {
          panic(fmt.Sprintf("open file fail:%s", err.Error()))
       }
    
       //从文件末尾逐行读取文件内容
       f.Seek(0, 2)
    
       rd := bufio.NewReader(f)
    
       for {
    
          line, err := rd.ReadBytes('\n')
    
          if err == io.EOF {
             log.Println(err)
             time.Sleep(500 * time.Millisecond)
             continue
          } else if err != nil {
             panic(fmt.Sprintf("ReadBytes error: %s", err.Error()))
          }
          rc <- line[:len(line)-1]
    
       }
    
    }

    如果注释不

    f.Seek(0, 2)

    则直接在

    line, err := rd.ReadBytes('\n')

    err==io.EOF


Go并发编程案例解析

课程带你通过一个真实的线上日志监控系统学习Golang以及并发的编程思想。

15207 学习 · 53 问题

查看课程

相似问题