Scanner is line-at-a-time. Reader lets you peek, unread, ReadString with any delimiter, and handle binary.
ReadString — delimiter-based
Returns the match including the delimiter. Returns err != nil at EOF even with data, so handle both.
r := bufio.NewReader(strings.NewReader("abc,def,"))
for {
s, err := r.ReadString(',')
if s != "" {
fmt.Printf("%q\n", s)
}
if err != nil {
break
}
}
Output
"abc,"
"def,"
Peek — look without consuming
r := bufio.NewReader(strings.NewReader("hello"))
b, _ := r.Peek(2)
fmt.Println(string(b))
fmt.Println(string(mustRead(r, 5)))
Output
he
hello
ReadByte / UnreadByte
r := bufio.NewReader(strings.NewReader("abc"))
c, _ := r.ReadByte()
r.UnreadByte()
d, _ := r.ReadByte()
fmt.Printf("%c %c\n", c, d) // 'a' 'a'