Ce face bufio.Scanner.Buffer
Implicit, un Scanner refuză bucățile mai mari de 64 KB (bufio.MaxScanTokenSize) cu eroarea bufio.ErrTooLong. Buffer îți permite să dai un buffer inițial (buf) și o limită nouă (max). Buffer-ul crește singur, după nevoie, până la max.
Trebuie apelată înainte de primul Scan. Exemplu tipic: fișiere JSON Lines sau jurnale cu rânduri foarte lungi: s.Buffer(make([]byte, 0, 64*1024), 10*1024*1024).
Parametri
| Parametru | Descriere |
|---|---|
buf |
Buffer-ul inițial; capacitatea lui contează. |
max |
Dimensiunea maximă a unei bucăți, în octeți. |
Ce returnează
Nimic. Dă panică dacă e apelată după începerea scanării.
Exemple
Exemplul 1: Un rând de 100 000 de caractere
package main
import (
"bufio"
"fmt"
"strings"
)
func numara(text string, mareste bool) {
s := bufio.NewScanner(strings.NewReader(text))
if mareste {
s.Buffer(make([]byte, 0, 64*1024), 1024*1024)
}
for s.Scan() {
fmt.Println("rând de", len(s.Text()), "caractere")
}
fmt.Println("eroare:", s.Err())
}
func main() {
lung := strings.Repeat("x", 100_000) + "\nscurt\n"
fmt.Println("implicit:")
numara(lung, false)
fmt.Println("cu Buffer de 1 MB:")
numara(lung, true)
}
Rezultat
implicit:
eroare: bufio.Scanner: token too long
cu Buffer de 1 MB:
rând de 100000 caractere
rând de 5 caractere
eroare: <nil>
Greșeli frecvente
- Dai un buffer mare, dar
maxmic: limita contează, nu dimensiunea buffer-ului. - Folosești o limită uriașă pentru date nesigure. Un singur rând imens poate consuma toată memoria; alege o limită rezonabilă.
Comenzi înrudite
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).bufio.Scanner.Err: Returnează eroarea care a oprit scanarea, sau nil dacă s-a ajuns normal la sfârșitul datelor.bufio.NewReader: Învelește un io.Reader într-un bufio.Reader, care citește pe blocuri și oferă ReadString, ReadRune, ReadLine.