bytes.Buffer.ReadString în Go

Citește din buffer până la un caracter-delimitator (inclusiv), ca text (ReadString) sau octeți (ReadBytes).

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

Ce face bytes.Buffer.ReadString

buf.ReadString(delim) citește până la prima apariție a octetului delim și returnează tot ce a citit, inclusiv delimitatorul. Cu '\n' citești rând cu rând. Dacă delimitatorul nu mai apare, returnează restul datelor și eroarea io.EOF.

ReadBytes face același lucru, dar returnează un []byte nou (o copie).

Parametri

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

Ce returnează

Datele citite (cu delimitator) și eroarea (io.EOF dacă delimitatorul nu a fost găsit).

Exemple

Exemplul 1: Citire rând cu rând

Ultimul rând nu se termină cu \n: vine împreună cu io.EOF, deci trebuie prelucrat înainte de a ieși din buclă.

package main

import (
	"bytes"
	"fmt"
	"io"
	"strings"
)

func main() {
	buf := bytes.NewBufferString("Iași\nCluj\nBrașov")
	for {
		rand, err := buf.ReadString('\n')
		if rand != "" {
			fmt.Printf("%q -> %s\n", rand, strings.TrimSuffix(rand, "\n"))
		}
		if err == io.EOF {
			break
		}
	}
}

Rezultat

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

Exemplul 2: ReadBytes cu alt delimitator

package main

import (
	"bytes"
	"fmt"
)

func main() {
	buf := bytes.NewBufferString("pâine;lapte;ouă")
	primul, err := buf.ReadBytes(';')
	fmt.Printf("%q %v\n", primul, err)
	fmt.Printf("rămas: %q\n", buf.String())
}

Rezultat

"pâine;" <nil>
rămas: "lapte;ouă"

Greșeli frecvente

  • Ieși din buclă imediat ce primești io.EOF, fără să prelucrezi datele returnate în același apel: pierzi ultimul rând dacă nu se termină cu \n.
  • Uiți că delimitatorul face parte din rezultat și compari rand == "Iași". Scoate-l cu strings.TrimSuffix sau TrimSpace.

Comenzi înrudite

  • bytes.Buffer.Read: Citește din buffer octeți (Read, ReadByte) sau caractere (ReadRune); UnreadByte și UnreadRune pun înapoi ultima citire.
  • bytes.Buffer: Un buffer de octeți care crește singur: scrii în el cu Write/WriteString/WriteByte/WriteRune și citești cu String() sau Bytes().
  • strings.SplitSeq: Variantele iterator ale lui Split, SplitAfter, Fields și FieldsFunc, plus Lines: parcurgi bucățile cu for range, fără slice.