bufio.Scanner.Buffer în Go

Setează buffer-ul inițial și dimensiunea maximă a unei bucăți, ca să poți citi rânduri mai lungi de 64 KB.

Sintaxă
func (s *Scanner) Buffer(buf []byte, max int)

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 max mic: 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.