slices.All în Go

Transformă un slice în iterator: All dă perechi (indice, valoare), Values doar valorile, Backward perechile de la coadă la cap.

Sintaxă
import "slices"

func All[Slice ~[]E, E any](s Slice) iter.Seq2[int, E]
func Values[Slice ~[]E, E any](s Slice) iter.Seq[E]
func Backward[Slice ~[]E, E any](s Slice) iter.Seq2[int, E]

Ce face slices.All

Din Go 1.23, bucla for range poate parcurge și funcții-iterator (iter.Seq, iter.Seq2). slices.All(s) produce perechi (indice, valoare), exact ca for i, v := range s. slices.Values(s) produce doar valorile.

Utilitatea lor apare când o funcție cere un iterator: maps.Collect, slices.Sorted, slices.AppendSeq sau propriile tale funcții care primesc iter.Seq.

slices.Backward(s) parcurge slice-ul de la ultimul element la primul, cu indicii originali, fără să-l modifice și fără să scrii o buclă cu i--.

Parametri

Parametru Descriere
s Slice-ul parcurs.

Ce returnează

Un iterator: iter.Seq2[int, E] pentru All și Backward, iter.Seq[E] pentru Values.

Exemple

Exemplul 1: All, Values și Backward

package main

import (
    "fmt"
    "slices"
)

func main() {
    zile := []string{"luni", "marți", "miercuri"}
    for i, z := range slices.All(zile) {
        fmt.Println(i, z)
    }
    for z := range slices.Values(zile) {
        fmt.Print(z, " ")
    }
    fmt.Println()
    for i, z := range slices.Backward(zile) {
        fmt.Println(i, z)
    }
}

Rezultat

0 luni
1 marți
2 miercuri
luni marți miercuri 
2 miercuri
1 marți
0 luni

Exemplul 2: Iteratori dați altor funcții

maps.Collect primește perechile (indice, valoare) și construiește un map. slices.Sorted primește valorile și returnează un slice nou, sortat.

package main

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

func main() {
    orase := []string{"Iași", "Arad", "Cluj"}
    dupaIndice := maps.Collect(slices.All(orase))
    fmt.Println(dupaIndice)

    sortate := slices.Sorted(slices.Values(orase))
    fmt.Println(sortate, orase)
}

Rezultat

map[0:Iași 1:Arad 2:Cluj]
[Arad Cluj Iași] [Iași Arad Cluj]

Greșeli frecvente

  • Folosești slices.All(s) doar ca să parcurgi slice-ul: for i, v := range s face exact același lucru, mai simplu.
  • Modifici slice-ul în timp ce îl parcurgi cu Backward sau All: iteratorul citește din aceeași memorie și poate vedea valorile schimbate.

Comenzi înrudite

  • slices.Collect: Collect strânge valorile unui iterator într-un slice nou; AppendSeq le adaugă la finalul unui slice existent.
  • slices.Sorted: Strânge valorile unui iterator într-un slice nou și îl sortează: Sorted (ordine naturală), SortedFunc și SortedStableFunc (comparație proprie).
  • iter.Seq: Tipurile pentru iteratori: Seq produce valori una câte una, Seq2 produce perechi; ambele se parcurg cu for range.
  • maps.All: Returnează un iterator peste perechile (cheie, valoare) ale unui map, în ordine aleatorie.
  • slices.Reverse: Inversează ordinea elementelor unui slice, pe loc.