Ce face strings.Builder.Grow
sb.Grow(n) se asigură că mai încap cel puțin n octeți fără o nouă alocare de memorie. Dacă știi cam cât de mare va fi textul, un singur Grow la început evită realocările repetate.
sb.Len() returnează câți octeți au fost scriși (nu câte caractere: „Iași” are 5 octeți). sb.Cap() returnează capacitatea bufferului, adică câți octeți încap până la următoarea alocare.
sb.Reset() golește Builder-ul și renunță la buffer: următoarea scriere alocă unul nou. Textele obținute înainte cu String() rămân valabile.
Parametri
| Parametru | Descriere |
|---|---|
n |
La Grow: câți octeți în plus trebuie să încapă. Un n negativ produce panic. |
Ce returnează
Len și Cap returnează numere de octeți; Grow și Reset nu returnează nimic.
Exemple
Exemplul 1: Len, Cap și Grow
package main
import (
"fmt"
"strings"
)
func main() {
var sb strings.Builder
fmt.Println("la început:", sb.Len(), sb.Cap())
sb.Grow(64)
fmt.Println("după Grow(64):", sb.Len(), sb.Cap() >= 64)
sb.WriteString("Iași")
fmt.Println("după „Iași”:", sb.Len(), "octeți, capacitate", sb.Cap())
}
Rezultat
la început: 0 0
după Grow(64): 0 true
după „Iași”: 5 octeți, capacitate 64
Exemplul 2: Reset pentru refolosire
package main
import (
"fmt"
"strings"
)
func main() {
var sb strings.Builder
var randuri []string
for _, elev := range []string{"Ana", "Ion"} {
sb.Reset()
sb.WriteString("Elev: ")
sb.WriteString(elev)
randuri = append(randuri, sb.String())
}
fmt.Printf("%q\n", randuri)
fmt.Println("după ultimul rând:", sb.Len(), sb.Cap())
sb.Reset()
fmt.Println("după Reset:", sb.Len(), sb.Cap())
}
Rezultat
["Elev: Ana" "Elev: Ion"]
după ultimul rând: 9 16
după Reset: 0 0
Greșeli frecvente
- Folosești
sb.Len()ca număr de caractere. Numără octeți; pentru caractere foloseșteutf8.RuneCountInString(sb.String()). - Te aștepți ca
Resetsă păstreze bufferul pentru refolosire. Nu îl păstrează (spre deosebire debytes.Buffer.Reset), pentru că textele returnate deString()îl folosesc încă.
Comenzi înrudite
strings.Builder: Construiește eficient un text din multe bucăți: adaugi cu WriteString, WriteByte, WriteRune sau Write și obții rezultatul cu String().bytes.Buffer.Len: Len dă octeții necitiți, Cap capacitatea, Grow rezervă loc, Available spațiul liber, iar AvailableBuffer un slice pentru scriere directă.