bufio.Reader.ReadString în Go

Citește până la (și inclusiv) caracterul delimitator; ReadString dă un string, ReadBytes un []byte.

Sintaxă
func (b *Reader) ReadString(delim byte) (string, error)
func (b *Reader) ReadBytes(delim byte) ([]byte, error)

Ce face bufio.Reader.ReadString

ReadString citește până întâlnește octetul delim (de obicei '\n') și returnează tot textul, inclusiv delimitatorul. ReadBytes face exact același lucru, dar returnează un []byte nou.

Dacă sursa se termină înainte de delimitator, primești ce s-a citit și eroarea io.EOF. De aceea, la ultimul rând al unui fișier fără \n final, ai text și io.EOF în același timp; prelucrează întâi textul.

Parametri

Parametru Descriere
delim Octetul la care se oprește citirea, de exemplu '\n' sau ';'.

Ce returnează

Textul citit (cu delimitator) și nil; sau textul rămas și io.EOF la final.

Exemple

Exemplul 1: Citire rând cu rând, cu ultimul rând fără \n

package main

import (
    "bufio"
    "errors"
    "fmt"
    "io"
    "strings"
)

func main() {
    r := bufio.NewReader(strings.NewReader("Iași\nCluj\nBrașov"))
    for {
        rand, err := r.ReadString('\n')
        if rand != "" {
            fmt.Printf("%q\n", rand)
        }
        if errors.Is(err, io.EOF) {
            break
        }
    }
}

Rezultat

"Iași\n"
"Cluj\n"
"Brașov"

Exemplul 2: Alt delimitator și ReadBytes

package main

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

func main() {
    r := bufio.NewReader(strings.NewReader("mere;pere;prune"))
    a, _ := r.ReadString(';')
    b, _ := r.ReadBytes(';')
    c, err := r.ReadString(';')
    fmt.Printf("%q %q %q %v\n", a, b, c, err)
}

Rezultat

"mere;" "pere;" "prune" EOF

Exemplul 3: Un meniu în consolă

package main

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

func main() {
    in := bufio.NewReader(os.Stdin)
    for {
        fmt.Print("Comandă (adauga/lista/iesire): ")
        linie, err := in.ReadString('\n')
        if err != nil {
            break
        }
        switch strings.TrimSpace(linie) {
        case "adauga":
            fmt.Println("-> produs adăugat")
        case "lista":
            fmt.Println("-> coș: 1 produs")
        case "iesire":
            fmt.Println("-> la revedere!")
            return
        default:
            fmt.Println("-> comandă necunoscută")
        }
    }
}

Ce scrie utilizatorul (intrare)

adauga
lista
zbor
iesire

Rezultat

Comandă (adauga/lista/iesire): -> produs adăugat
Comandă (adauga/lista/iesire): -> coș: 1 produs
Comandă (adauga/lista/iesire): -> comandă necunoscută
Comandă (adauga/lista/iesire): -> la revedere!

Greșeli frecvente

  • Compari rezultatul direct: linie == "da". Linia conține și \n (iar pe Windows \r\n); folosește strings.TrimSpace.
  • Te oprești la err != nil fără să prelucrezi textul primit. Ultimul rând fără \n se pierde.

Comenzi înrudite

  • bufio.NewReader: Învelește un io.Reader într-un bufio.Reader, care citește pe blocuri și oferă ReadString, ReadRune, ReadLine.
  • bufio.Reader.ReadLine: Citește un rând fără caracterul de final, la nivel scăzut; rândurile prea lungi vin pe bucăți.
  • 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).