bytes.Buffer.ReadFrom în Go

ReadFrom citește tot dintr-o sursă (io.Reader) în buffer; WriteTo scrie tot conținutul bufferului într-o destinație (io.Writer).

Sintaxă
func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error)
func (b *Buffer) WriteTo(w io.Writer) (n int64, err error)

Ce face bytes.Buffer.ReadFrom

buf.ReadFrom(r) citește din r până la sfârșit (io.EOF) și adaugă totul în buffer, mărindu-l cât e nevoie. Returnează numărul de octeți citiți; io.EOF nu este raportat ca eroare.

buf.WriteTo(w) scrie toată partea necitită în w (un fișier, os.Stdout, o conexiune) și golește bufferul. Ambele metode sunt folosite automat de io.Copy când una dintre părți este un *bytes.Buffer.

Parametri

Parametru Descriere
r La ReadFrom: sursa.
w La WriteTo: destinația.

Ce returnează

Numărul de octeți transferați (int64) și eroarea.

Exemple

Exemplul 1: Citirea unui fișier întreg în buffer

package main

import (
	"bytes"
	"fmt"
	"os"
)

func main() {
	os.WriteFile("note.txt", []byte("Ana 10\nIon 8\n"), 0o644)

	f, err := os.Open("note.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	var buf bytes.Buffer
	n, err := buf.ReadFrom(f)
	fmt.Println("citit:", n, "octeți, eroare:", err)
	fmt.Print(buf.String())
}

Rezultat

citit: 13 octeți, eroare: <nil>
Ana 10
Ion 8

Exemplul 2: WriteTo pe ecran golește bufferul

package main

import (
	"bytes"
	"fmt"
	"os"
	"strings"
)

func main() {
	var buf bytes.Buffer
	buf.ReadFrom(strings.NewReader("Raport: totul este în regulă.\n"))
	n, _ := buf.WriteTo(os.Stdout)
	fmt.Println("scris:", n, "octeți; rămas în buffer:", buf.Len())
}

Rezultat

Raport: totul este în regulă.
scris: 32 octeți; rămas în buffer: 0

Greșeli frecvente

  • Folosești ReadFrom pe surse foarte mari sau fără sfârșit (o conexiune deschisă): bufferul crește până se termină memoria. Pentru date mari, prelucrează în bucăți sau limitează cu io.LimitReader.

Comenzi înrudite

  • 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.Reader: Face dintr-un text o sursă de citire (io.Reader), ca să-l dai funcțiilor care citesc din fișiere sau rețea.
  • bytes.Buffer.Read: Citește din buffer octeți (Read, ReadByte) sau caractere (ReadRune); UnreadByte și UnreadRune pun înapoi ultima citire.