slices.Grow în Go

Grow rezervă loc pentru încă n elemente fără realocări ulterioare; Clip elimină capacitatea nefolosită.

Sintaxă
import "slices"

func Grow[S ~[]E, E any](s S, n int) S
func Clip[S ~[]E, E any](s S) S

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ă Grow adaugă elemente: lungimea rămâne neschimbată; elementele le adaugi cu append.

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.