bufio.Scanner.Err în Go

Returnează eroarea care a oprit scanarea, sau nil dacă s-a ajuns normal la sfârșitul datelor.

Sintaxă
func (s *Scanner) Err() error

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).