slices.Chunk în Go

Împarte un slice în bucăți consecutive de câte n elemente (ultima poate fi mai scurtă), ca iterator.

Sintaxă
import "slices"

func Chunk[Slice ~[]E, E any](s Slice, n int) iter.Seq[Slice]

Ce face slices.Chunk

slices.Chunk(s, n) returnează un iterator pe care îl parcurgi cu for bucata := range slices.Chunk(s, n). Fiecare bucată are n elemente, în afară de ultima, care poate avea mai puține. Este util la paginare sau la trimiterea datelor în loturi.

Bucățile sunt sub-slice-uri ale lui s, nu copii: folosesc aceeași memorie. Dacă n este mai mic decât 1, programul se oprește cu panic.

Parametri

Parametru Descriere
s Slice-ul împărțit.
n Mărimea unei bucăți (≥ 1).

Ce returnează

Un iter.Seq care produce bucățile, în ordine.

Exemple

Exemplul 1: Elevi împărțiți în grupe de câte 3

package main

import (
    "fmt"
    "slices"
)

func main() {
    elevi := []string{"Ana", "Mihai", "Ioana", "Radu", "Elena", "Dan", "Maria"}
    grupa := 1
    for g := range slices.Chunk(elevi, 3) {
        fmt.Printf("Grupa %d: %v\n", grupa, g)
        grupa++
    }
}

Rezultat

Grupa 1: [Ana Mihai Ioana]
Grupa 2: [Radu Elena Dan]
Grupa 3: [Maria]

Exemplul 2: Sume pe loturi

package main

import (
    "fmt"
    "slices"
)

func main() {
    vanzari := []int{120, 80, 45, 300, 15, 60, 90, 10}
    for lot := range slices.Chunk(vanzari, 4) {
        suma := 0
        for _, v := range lot {
            suma += v
        }
        fmt.Println(lot, "=", suma, "lei")
    }
}

Rezultat

[120 80 45 300] = 545 lei
[15 60 90 10] = 175 lei

Greșeli frecvente

  • Modifici o bucată și te miri că s-a schimbat și slice-ul inițial: bucățile împart memoria cu el. Folosește slices.Clone pe bucată dacă vrei o copie.

Comenzi înrudite

  • slices.All: Transformă un slice în iterator: All dă perechi (indice, valoare), Values doar valorile, Backward perechile de la coadă la cap.
  • slices.Collect: Collect strânge valorile unui iterator într-un slice nou; AppendSeq le adaugă la finalul unui slice existent.
  • iter.Seq: Tipurile pentru iteratori: Seq produce valori una câte una, Seq2 produce perechi; ambele se parcurg cu for range.