bytes.Buffer.Len în Go

Octeți: pachetul bytes și bytes.Buffer Go 1.0 (Cap din 1.5, Grow din 1.1, Available și AvailableBuffer din 1.21)

Len dă octeții necitiți, Cap capacitatea, Grow rezervă loc, Available spațiul liber, iar AvailableBuffer un slice pentru scriere directă.

Sintaxă
func (b *Buffer) Len() int
func (b *Buffer) Cap() int
func (b *Buffer) Grow(n int)
func (b *Buffer) Available() int
func (b *Buffer) AvailableBuffer() []byte

Ce face bytes.Buffer.Len

buf.Len() returnează numărul de octeți necitiți (scade pe măsură ce citești). buf.Cap() returnează capacitatea memoriei rezervate. buf.Available() spune câți octeți mai încap fără o nouă alocare.

buf.Grow(n) se asigură că mai încap cel puțin n octeți fără realocare; apelat o dată la început, evită realocările repetate.

buf.AvailableBuffer() returnează un slice gol, cu capacitatea egală cu spațiul liber. Îl folosești cu funcțiile Append* (de exemplu strconv.AppendInt) și apoi îl dai imediat lui buf.Write: numărul se scrie direct în memoria bufferului, fără text intermediar.

Parametri

Parametru Descriere
n La Grow: câți octeți trebuie să mai încapă (negativ produce panic).

Ce returnează

Len, Cap, Available: numere de octeți. AvailableBuffer: un []byte de lungime 0. Grow nu returnează nimic.

Exemple

Exemplul 1: Len scade la citire

package main

import (
	"bytes"
	"fmt"
)

func main() {
	var buf bytes.Buffer
	buf.Grow(64)
	fmt.Println("Len:", buf.Len(), "Cap >= 64:", buf.Cap() >= 64)
	buf.WriteString("Brașov")
	fmt.Println("după scriere, Len:", buf.Len(), "Available + Len == Cap:", buf.Available()+buf.Len() == buf.Cap())
	buf.Next(3)
	fmt.Println("după Next(3), Len:", buf.Len(), "rămas:", buf.String())
}

Rezultat

Len: 0 Cap >= 64: true
după scriere, Len: 7 Available + Len == Cap: true
după Next(3), Len: 4 rămas: șov

Exemplul 2: AvailableBuffer cu strconv.AppendInt

package main

import (
	"bytes"
	"fmt"
	"strconv"
)

func main() {
	var buf bytes.Buffer
	for _, nota := range []int64{10, 9, 7} {
		b := buf.AvailableBuffer()
		b = strconv.AppendInt(b, nota, 10)
		b = append(b, ' ')
		buf.Write(b)
	}
	fmt.Printf("%q\n", buf.String())
}

Rezultat

"10 9 7 "

Greșeli frecvente

  • Folosești Len() ca total scris. După citiri, Len arată doar ce a rămas necitit.
  • Păstrezi slice-ul de la AvailableBuffer după Write. Este valabil doar până la următoarea scriere.

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().
  • bytes.Buffer.Reset: Reset golește bufferul și păstrează memoria pentru refolosire; Truncate păstrează doar primii n octeți necitiți.
  • strings.Builder.Grow: Grow rezervă loc dinainte, Len dă octeții scriși, Cap capacitatea bufferului, iar Reset golește Builder-ul.
  • strconv.AppendInt: Adaugă un număr sau un bool, scris ca text, la sfârșitul unui []byte, fără să creeze un text intermediar.