bufio.Scanner.Scan în Go

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.

Sintaxă
func (s *Scanner) Scan() bool

Ce face bufio.Scanner.Scan

Scan citește din sursă cât îi trebuie ca să găsească următoarea bucată, apoi o face disponibilă prin Text și Bytes. Returnează true dacă a găsit o bucată și false la final sau la eroare.

Se folosește aproape mereu ca o condiție de buclă: for s.Scan() { ... }. După ce a returnat false, apelurile următoare returnează tot false. Ultimul rând este găsit chiar dacă nu se termină cu \n.

Ce returnează

true dacă există o bucată nouă, altfel false.

Exemple

Exemplul 1: Bucla clasică

package main

import (
    "bufio"
    "fmt"
    "strings"
)

func main() {
    s := bufio.NewScanner(strings.NewReader("Ana 9\nMihai 7\nIoana 10"))
    for s.Scan() {
        fmt.Println("rând:", s.Text())
    }
    fmt.Println("mai e ceva?", s.Scan())
}

Rezultat

rând: Ana 9
rând: Mihai 7
rând: Ioana 10
mai e ceva? false

Exemplul 2: Doar primele rânduri

package main

import (
    "bufio"
    "fmt"
    "strings"
)

func main() {
    jurnal := "09:00 start\n09:01 conectat\n09:05 comanda 1\n09:07 comanda 2\n09:09 comanda 3\n"
    s := bufio.NewScanner(strings.NewReader(jurnal))
    for i := 0; i < 3 && s.Scan(); i++ {
        fmt.Println(s.Text())
    }
}

Rezultat

09:00 start
09:01 conectat
09:05 comanda 1

Exemplul 3: Rânduri citite de la tastatură

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    s := bufio.NewScanner(os.Stdin)
    fmt.Println("Scrie orașe (rând gol = stop):")
    var orase []string
    for s.Scan() && s.Text() != "" {
        orase = append(orase, s.Text())
    }
    fmt.Println("Ai scris:", strings.Join(orase, ", "))
}

Ce scrie utilizatorul (intrare)

Iași
Cluj
Oradea

acest rând nu mai e citit

Rezultat

Scrie orașe (rând gol = stop):
Ai scris: Iași, Cluj, Oradea

Greșeli frecvente

  • Apelezi Text() înainte de primul Scan(). Rezultatul este gol.
  • Scrii for s.Scan() == true sau verifici Scan de două ori pe iterație. Fiecare apel consumă o bucată.

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.Text: Text returnează bucata curentă găsită de Scan, ca string; Bytes o returnează ca []byte, fără copiere.
  • bufio.Scanner.Err: Returnează eroarea care a oprit scanarea, sau nil dacă s-a ajuns normal la sfârșitul datelor.