Несколько очевидных подходов приходят на ум.
Прежде всего, взгляните на source for bufio.ScanLines
, он невелик, и вы можете легко реализовать свой собственный bufio.SplitFunc
с нуля, начиная с копии этого измененного, чтобы делать то, что вы хотите.
Во-вторых, вы можете написать bufio.SplitFunc
, который вызвал bufio.ScanLines
в цикле, комбинируя токены, пока он возвращает те, которые заканчиваются в вашем escape-символе, а затем возвращают комбинированный токен.
Учитывая короткий размер и простоту первого подхода, это то, что я, вероятно, сделаю. Второй подход, скорее всего, закончится так же долго, будет менее эффективным и, вероятно, потребует состояния, так как вам нужно будет хранить комбинированный токен-так-далеко, возвращая (0, nil, nil)
, чтобы запросить дополнительный ввод.
Другим решением было бы реализовать Transformer
(от golang.org/x/text/transform
пакета), который удаляет соответствующие экранированные символы из входного сигнала (например, удаляет "\\\n"
) и использовать transform.NewReader
сделать фильтрованную читателю, что вы тогда же использовать, как вы (например, переходя к bufio.Scanner
с обычным ScanLines
).
В любом случае вы можете скопировать соответствующие тесты с scan_test.go
, а также добавить свои собственные для поведения с экранированной новой строкой. Опасайтесь bufio.MaxScanTokenSize
.
Что такое 'f' в вашем коде? –
Также у вас есть 'line1 \\' в выводе, если вход имеет только 'line1 \'? –
'f, err: = os.Open (filename)' – mattes