2 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
SplitFunc
提供給的默認(rèn)值bufio.NewScanner
包括SplitLines
一個(gè)調(diào)用dropCR
,根據(jù)注釋,該調(diào)用在行尾匹配\r?\n
。因?yàn)?code>Scanner會(huì)選擇性地查找和刪除回車符,所以您將無(wú)法使用bufio.Scanner
.
根據(jù)我的經(jīng)驗(yàn),在基本情況下使用 Scanner 是很常見(jiàn)的,因?yàn)樗且粋€(gè)方便的結(jié)構(gòu)。否則 bufio.Reader 提供了更大的靈活性。bufio.Reader#ReadBytes(delim byte)
會(huì)給你你正在尋找的東西。

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
雖然這是一個(gè)答案,從字面意義上回答了我關(guān)于包括\n和潛在的\r問(wèn)題,但在閱讀 IMAP 服務(wù)器的響應(yīng)時(shí)首先使用 Scanner 并不是正確的工具,我將重寫我對(duì) Scanner 的使用并替換它與 bufio.Reader。
您可以指定在掃描器中使用的自定義拆分函數(shù),例如,您可以將 ScanLines 拆分函數(shù)移植到一個(gè)不會(huì)使用返回的令牌丟棄換行符的函數(shù)。
// ...
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 關(guān)注
- 156 瀏覽
添加回答
舉報(bào)