slices.Collect în Go

Collect strânge valorile unui iterator într-un slice nou; AppendSeq le adaugă la finalul unui slice existent.

Sintaxă
import "slices"

func Collect[E any](seq iter.Seq[E]) []E
func AppendSeq[Slice ~[]E, E any](s Slice, seq iter.Seq[E]) Slice

Ce face slices.Collect

slices.Collect(seq) parcurge iteratorul și pune fiecare valoare într-un slice nou, în ordinea primită. Cel mai des îl folosești cu maps.Keys sau maps.Values, care returnează iteratori, nu slice-uri.

slices.AppendSeq(s, seq) adaugă valorile iteratorului la finalul lui s, ca un append, și returnează slice-ul rezultat.

Atenție: valorile din maps.Keys/maps.Values vin într-o ordine aleatorie. Dacă ordinea contează, folosește slices.Sorted în loc de Collect.

Parametri

Parametru Descriere
seq Iteratorul ale cărui valori le strângi.
s Pentru AppendSeq: slice-ul la care adaugi.

Ce returnează

Un slice cu valorile iteratorului.

Exemple

Exemplul 1: Valorile unui iterator propriu

numerePare este un iterator scris de mână (vezi iter.Seq). Collect îl transformă în slice.

package main

import (
    "fmt"
    "iter"
    "slices"
)

func numerePare(max int) iter.Seq[int] {
    return func(yield func(int) bool) {
        for i := 0; i <= max; i += 2 {
            if !yield(i) {
                return
            }
        }
    }
}

func main() {
    pare := slices.Collect(numerePare(10))
    fmt.Println(pare)

    pare = slices.AppendSeq(pare, slices.Values([]int{100, 200}))
    fmt.Println(pare)
}

Rezultat

[0 2 4 6 8 10]
[0 2 4 6 8 10 100 200]

Exemplul 2: Cheile unui map, sortate

Collect păstrează ordinea aleatorie a map-ului, deci sortăm după. Mai scurt: slices.Sorted(maps.Keys(m)).

package main

import (
    "fmt"
    "maps"
    "slices"
)

func main() {
    stoc := map[string]int{"mere": 40, "pere": 12, "caise": 7}
    chei := slices.Collect(maps.Keys(stoc))
    slices.Sort(chei)
    fmt.Println(chei)
    fmt.Println(slices.Sorted(maps.Keys(stoc)))
}

Rezultat

[caise mere pere]
[caise mere pere]

Greșeli frecvente

  • Afișezi direct slices.Collect(maps.Keys(m)) și te bazezi pe ordine: ordinea diferă de la o rulare la alta.

Comenzi înrudite

  • slices.Sorted: Strânge valorile unui iterator într-un slice nou și îl sortează: Sorted (ordine naturală), SortedFunc și SortedStableFunc (comparație proprie).
  • slices.All: Transformă un slice în iterator: All dă perechi (indice, valoare), Values doar valorile, Backward perechile de la coadă la cap.
  • maps.Keys: Returnează un iterator peste cheile (Keys) sau valorile (Values) unui map, în ordine aleatorie.
  • iter.Seq: Tipurile pentru iteratori: Seq produce valori una câte una, Seq2 produce perechi; ambele se parcurg cu for range.