Ce face slices.Grow
Un slice are o lungime (len, câte elemente are) și o capacitate (cap, câte încap fără să se aloce memorie nouă). slices.Grow(s, n) crește capacitatea astfel încât să mai poți adăuga cel puțin n elemente cu append fără nicio realocare. Lungimea rămâne aceeași.
slices.Clip(s) face capacitatea egală cu lungimea. După Clip, un append pe slice alocă memorie nouă, deci nu poate suprascrie datele de după finalul slice-ului. Este util când returnezi o bucată dintr-un slice mai mare.
Parametri
| Parametru | Descriere |
|---|---|
s |
Slice-ul. |
n |
Pentru Grow: câte elemente în plus trebuie să încapă (≥ 0). |
Ce returnează
Slice-ul cu capacitatea modificată (atribuie rezultatul).
Exemple
Exemplul 1: Rezervarea locului înainte de o buclă
package main
import (
"fmt"
"slices"
)
func main() {
var patrate []int
patrate = slices.Grow(patrate, 100)
fmt.Println(len(patrate), cap(patrate) >= 100)
for i := range 100 {
patrate = append(patrate, i*i)
}
fmt.Println(len(patrate), patrate[99])
}
Rezultat
0 true
100 9801
Exemplul 2: Clip protejează restul datelor
Fără Clip, append pe primele două note scrie peste a treia notă din slice-ul mare.
package main
import (
"fmt"
"slices"
)
func main() {
note := []int{9, 8, 7, 6}
primele := note[:2]
fmt.Println(len(primele), cap(primele))
_ = append(primele, 1)
fmt.Println(note)
note = []int{9, 8, 7, 6}
primele = slices.Clip(note[:2])
fmt.Println(len(primele), cap(primele))
_ = append(primele, 1)
fmt.Println(note)
}
Rezultat
2 4
[9 8 1 6]
2 2
[9 8 7 6]
Greșeli frecvente
- Uiți să atribui rezultatul lui
Grow: capacitatea nouă se pierde. - Crezi că
Growadaugă elemente: lungimea rămâne neschimbată; elementele le adaugi cuappend.
Comenzi înrudite
slices.Clone: Returnează o copie a unui slice, cu memorie proprie: modificările copiei nu afectează originalul.slices.Concat: Lipește mai multe slice-uri într-unul nou, alocat o singură dată.slices.Insert: Inserează una sau mai multe valori la poziția i și returnează slice-ul rezultat.