2 回答
TA贡献1898条经验 获得超8个赞
SplitFunc
提供给的默认值bufio.NewScanner
包括SplitLines
一个调用dropCR
,根据注释,该调用在行尾匹配\r?\n
。因为Scanner
会选择性地查找和删除回车符,所以您将无法使用bufio.Scanner
.
根据我的经验,在基本情况下使用 Scanner 是很常见的,因为它是一个方便的结构。否则 bufio.Reader 提供了更大的灵活性。bufio.Reader#ReadBytes(delim byte)
会给你你正在寻找的东西。
TA贡献1845条经验 获得超8个赞
虽然这是一个答案,从字面意义上回答了我关于包括\n和潜在的\r问题,但在阅读 IMAP 服务器的响应时首先使用 Scanner 并不是正确的工具,我将重写我对 Scanner 的使用并替换它与 bufio.Reader。
您可以指定在扫描器中使用的自定义拆分函数,例如,您可以将 ScanLines 拆分函数移植到一个不会使用返回的令牌丢弃换行符的函数。
// ...
r := bufio.NewScanner(d.conn)
r.Split(func(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, data[0 : i+1], nil
}
// If we're at EOF, we have a final, non-terminated line. Return it.
if atEOF {
return len(data), data, nil
}
// Request more data.
return 0, nil, nil
})
for r.Scan() {
line := r.Text()
len(line) // now gets the line length WITH the newline
}
- 2 回答
- 0 关注
- 108 浏览
添加回答
举报