扫描仪提前终止

扫描仪提前终止,第1张

扫描仪提前终止

我认为这是一个错误,因为即使返回令牌为nil(bufio.SplitFunc),也不会将Advance
value> 0用作进一步的读取调用:

如果数据尚未持有完整的令牌,例如,如果在扫描行时没有换行符,则SplitFunc可以返回(0,nil),以指示扫描程序将更多数据读入切片,并尝试以更长的切片开始于输入中的相同点。

这是怎么回事

bufio.Scanner
默认的输入缓冲区为4096字节。这意味着它会一次读取最多此数量的内容,然后执行split功能。在您的情况下,扫描器可以一次读取所有输入,因为它远低于4096字节。
这意味着下一次读取将产生结果,
EOF
这是这里的主要问题。

一步步
  1. scanner.Scan
    读取您的所有数据
  2. 您得到了那里的所有文本
  3. 您寻找令牌,找到第一个换行符,它只是一个换行符
  4. nil
    通过从比赛中删除换行符来作为令牌返回
  5. scanner.Scan
    假设:用户需要更多数据
  6. scanner.Scan
    尝试阅读更多
  7. EOF
    发生
  8. scanner.Scan
    尝试最后一次标记化
  9. 你发现
    "Just a test."
  10. scanner.Scan
    尝试最后一次标记化
  11. 您寻找令牌,找到第三行,它只是一个换行符
  12. nil
    通过从比赛中删除换行符来作为令牌返回
  13. scanner.Scan
    看到
    nil
    令牌并设置错误(
    EOF
  14. 执行结束
如何规避

任何非null的令牌都将阻止这种情况。只要您返回非零令牌,扫描程序就不会检查

EOF
并继续执行令牌生成器。

您的代码返回

nil
令牌的原因是什么也没做就
bytes.Replace
返回
。。你可以阻止这种通过用容量返回片并没有元素,因为这将是非零:。
nil
append([]byte(nil),nil...) == nil``make([]byte, 0, 1) != nil



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5163563.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-18
下一篇2022-11-18

发表评论

登录后才能评论

评论列表(0条)

    保存