我正在尝试适应bufio.ScanLines,因此它知道转义的新行\\n

输入:

line1 \
continues on line2

预期产量:
["line1 continues on line2"]

现在,bufio.ScanLines的输出(请参见下面的示例代码)为:
["line1 \\", "continues on line2"]

示例代码:
s := bufio.NewScanner(f)
s.Split(bufio.ScanLines)

for s.Scan() {
    fmt.Println(s.Text())
}

最好的方法是什么?寻找仍可通过https://golang.org/src/bufio/scan_test.go测试的实现。

最佳答案

我想到了一些显而易见的方法。

首先,看一下source for bufio.ScanLines ,它不是很大,您可以轻松地从头实现自己的 bufio.SplitFunc ,从修改后的副本开始执行您想要的操作。

其次,您可以在循环中编写一个称为bufio.SplitFuncbufio.ScanLines,组合 token ,只要它返回以转义符结尾的 token ,然后返回组合的 token 。

考虑到第一种方法的大小和简单性,我可能会这样做。第二种方法可能会花费同样长的时间,效率会降低,并且可能需要状态,因为返回(0, nil, nil)要求更多输入时,您需要存储到目前为止的组合 token 。

另一种解决方案是实现 Transformer (来自golang.org/x/text/transform包),从输入中剥离相关的转义字符(例如,删除"\\\n"),然后使用transform.NewReader生成过滤器,然后根据需要使用(例如,传递给bufio.Scanner与常规ScanLines)。

无论如何,您都可以从scan_test.go复制适当的测试,也可以为转义的换行符行为添加自己的测试。还要小心bufio.MaxScanTokenSize

关于go - bufio.ScanLines与转义的新行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30431331/

10-11 16:53