bytes.Buffer.Next în Go

Octeți: pachetul bytes și bytes.Buffer Go 1.0 (Peek din Go 1.26)

Next returnează următorii n octeți și îi consumă; Peek îi returnează fără să-i consume.

Sintaxă
func (b *Buffer) Next(n int) []byte
func (b *Buffer) Peek(n int) ([]byte, error)

Ce face bytes.Buffer.Next

buf.Next(n) returnează următorii n octeți necitiți (sau câți au mai rămas, dacă sunt mai puțini) și avansează citirea după ei. Este un mod simplu de a citi câmpuri de lungime fixă.

buf.Peek(n), nou în Go 1.26, returnează următorii n octeți fără să-i consume: următoarea citire începe tot de acolo. Dacă sunt mai puțin de n octeți, returnează ce există și io.EOF.

Ambele returnează un slice care împarte memoria cu bufferul și este valabil doar până la următoarea citire sau scriere. Copiază-l dacă vrei să-l păstrezi.

Parametri

Parametru Descriere
n Numărul de octeți.

Ce returnează

Next: slice-ul cu octeții. Peek: slice-ul și o eroare (io.EOF dacă nu erau destui octeți).

Exemple

Exemplul 1: Câmpuri de lungime fixă

package main

import (
	"bytes"
	"fmt"
)

func main() {
	// cod județ (2), an (4), număr (3)
	buf := bytes.NewBufferString("IS2026042")
	judet := string(buf.Next(2))
	an := string(buf.Next(4))
	nr := string(buf.Next(3))
	fmt.Println(judet, an, nr)
	fmt.Printf("%q\n", buf.Next(10))
}

Rezultat

IS 2026 042
""

Exemplul 2: Peek: te uiți fără să citești

package main

import (
	"bytes"
	"fmt"
)

func main() {
	buf := bytes.NewBufferString("GET /index.html")
	inceput, _ := buf.Peek(3)
	fmt.Printf("cerere: %s\n", inceput)
	fmt.Println("bufferul e neschimbat:", buf.String())

	prea, err := buf.Peek(100)
	fmt.Println(len(prea), err)
}

Rezultat

cerere: GET
bufferul e neschimbat: GET /index.html
15 EOF

Greșeli frecvente

  • Păstrezi slice-ul de la Next sau Peek și apoi scrii în buffer: datele din slice se pot schimba.
  • Folosești Peek pe o versiune de Go mai veche de 1.26: metoda nu există.

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.Reset: Reset golește bufferul și păstrează memoria pentru refolosire; Truncate păstrează doar primii n octeți necitiți.