TIL: Go bufio.Scanner only discards a single trailing newline
2021-11-10 00:00:00 +0000 UTCWhen using a bufio.Scanner to iterate over an io.Reader using the default ScanLines as the SplitFunc, the Scanner will stop at each newline character. That is, consecutive newlines will result in empty tokens.
This squares with the documentation for the ScanLines function linked above, which says:
The end-of-line marker is one optional carriage return followed by one mandatory newline. In regular expression notation, it is
\r?\n.
For example, the following code:
package main
import (
"bufio"
"strings"
"fmt"
)
func main() {
test := "Line 1\nLine 2\n\nLine 3\n"
r := strings.NewReader(test)
scanner := bufio.NewScanner(r)
output := 1
for scanner.Scan() {
line := scanner.Text()
fmt.Printf("Line %d of length %d: %s\n", output, len(line), line)
output++
}
}
Produces the following output:
Line 1 of length 6: Line 1
Line 2 of length 6: Line 2
Line 3 of length 0:
Line 4 of length 6: Line 3