Ce face bufio.Scanner.Err
Când Scan returnează false, nu știi încă de ce. Err lămurește: nil înseamnă că datele s-au terminat normal (io.EOF nu este raportat), altfel primești eroarea, de exemplu o eroare de citire a fișierului sau bufio.ErrTooLong pentru un rând prea lung.
Se apelează o singură dată, după bucla for s.Scan().
Ce returnează
Prima eroare non-EOF întâlnită sau nil.
Exemple
Exemplul 1: Sfârșit normal
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
s := bufio.NewScanner(strings.NewReader("a\nb\nc\n"))
n := 0
for s.Scan() {
n++
}
fmt.Println("rânduri:", n, "| eroare:", s.Err())
}
Rezultat
rânduri: 3 | eroare: <nil>
Exemplul 2: Rând prea lung
Limităm buffer-ul la 16 octeți ca să provocăm eroarea; fără Err am crede că fișierul are un singur rând.
package main
import (
"bufio"
"errors"
"fmt"
"strings"
)
func main() {
text := "scurt\nacest rând este mult prea lung pentru buffer\nfinal\n"
s := bufio.NewScanner(strings.NewReader(text))
s.Buffer(make([]byte, 16), 16)
for s.Scan() {
fmt.Println("citit:", s.Text())
}
err := s.Err()
fmt.Println("eroare:", err)
fmt.Println("ErrTooLong:", errors.Is(err, bufio.ErrTooLong))
}
Rezultat
citit: scurt
eroare: bufio.Scanner: token too long
ErrTooLong: true
Exemplul 3: Eroare de citire din sursă
package main
import (
"bufio"
"errors"
"fmt"
"io"
"strings"
)
func main() {
pr, pw := io.Pipe()
go func() {
io.Copy(pw, strings.NewReader("rândul 1\nrândul 2\n"))
pw.CloseWithError(errors.New("conexiune întreruptă"))
}()
s := bufio.NewScanner(pr)
for s.Scan() {
fmt.Println(s.Text())
}
if err := s.Err(); err != nil {
fmt.Println("citirea s-a oprit:", err)
}
}
Rezultat
rândul 1
rândul 2
citirea s-a oprit: conexiune întreruptă
Greșeli frecvente
- Omiți
s.Err()și raportezi „gata” chiar dacă citirea a eșuat la jumătate.
Comenzi înrudite
bufio.Scanner.Scan: Trece la următoarea bucată (rând, cuvânt) din sursă; returnează false când nu mai sunt date sau a apărut o eroare.bufio.Scanner.Buffer: Setează buffer-ul inițial și dimensiunea maximă a unei bucăți, ca să poți citi rânduri mai lungi de 64 KB.bufio.NewScanner: Creează un bufio.Scanner, cel mai simplu mod de a citi un text rând cu rând (sau cuvânt cu cuvânt).