关于bufio包中Scan方法的疑问

tianlei · · 716 次点击 · 开始浏览    置顶
### Scan方法中有如下代码片段一 ``` if s.end > s.start || s.err != nil { advance, token, err := s.split(s.buf[s.start:s.end], s.err != nil) if err != nil { if err == ErrFinalToken { s.token = token s.done = true return true } s.setErr(err) return false } ..... } func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { if atEOF && len(data) == 0 { return 0, nil, nil } if i := bytes.IndexByte(data, '\n'); i >= 0 { // We have a full newline-terminated line. return i + 1, dropCR(data[0:i]), nil } // If we're at EOF, we have a final, non-terminated line. Return it. if atEOF { return len(data), dropCR(data), nil } // Request more data. return 0, nil, nil } ``` 此段代码中,s.split实际会调用ScanLines函数,这个函数里面无论如何返回的err都是nil的,这样的话s.split后面的if err != nil是为啥呢。 ### Scan代码片段二 ``` const maxInt = int(^uint(0) >> 1) if len(s.buf) >= s.maxTokenSize || len(s.buf) > maxInt/2 { s.setErr(ErrTooLong) return false } ``` 这里是buffer满了分配新空间,新空间溢出判断为什么要使用maxInt,在64位windows机器里面,此值是9223372036854775807即便是32位机器也有4294967295,但maxTokenSize在我机器里面仅仅是64 * 1024。为什么要设置一个这么大的值作为上限,内存明显可能不足吧。 请大神指点

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

716 次点击  
加入收藏 微博
2 回复  |  直到 2021-07-12 11:43:31
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传