为了账号安全,请及时绑定邮箱和手机立即绑定

//f.Seek(0, 2)

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

读取时err会等于EOF

正在回答

6 回答

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

1 回复 有任何疑惑可以回复我~

最后一个字节吧

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~
#1

小月肖 提问者

seek的目的是为了读取\n
2018-04-23 回复 有任何疑惑可以回复我~
#2

麦可同学 回复 小月肖 提问者

f.Seek(0, 2) 的作用是将文件指针移动到末尾哈,你可以看下官方文档:https://golang.org/pkg/os/#File.Seek
2018-04-24 回复 有任何疑惑可以回复我~
#3

小月肖 提问者

知道啦
2018-04-24 回复 有任何疑惑可以回复我~
#4

小月肖 提问者 回复 麦可同学

是将指针移到整个文件的最后吗? 不是移到某一行的最后吗
2018-04-24 回复 有任何疑惑可以回复我~
查看1条回复

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


0 回复 有任何疑惑可以回复我~
#1

A_小颖

对啊,程序会一直读取文件内容,直到末尾,如果没有新增的日志数据,肯定会返回io.EOF,这时需要等待新的日志产生。
2018-04-23 回复 有任何疑惑可以回复我~

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

2 回复 有任何疑惑可以回复我~
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


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Go并发编程案例解析
  • 参与学习       15207    人
  • 解答问题       53    个

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

进入课程

//f.Seek(0, 2)

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信