Salt la conținutul principal
Modulul 2 · Lecția 3 din 58/50 în curs~10 min
Lecții din modul (3/5)

pentru...gamă

for ... range este modalitatea idiomatică de a itera colecții: felii, matrice, hărți, șiruri și canale. Sintaxa se modifică ușor în funcție de colecție, dar modelul de bază este întotdeauna același: for key, value := range coll { ... }.

Gamă pe felii și matrice

Returnează index și copie a valorii:

Go
nums := []int{10, 20, 30}
for i, v := range nums {
    fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30

Adesea, unul dintre cele două este suficient:

Go
// solo indice
for i := range nums { _ = i }

// solo valore (ignora indice con _)
for _, v := range nums { _ = v }

Raza de acțiune pe o hartă

Returnează cheie și valoare:

Go
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
    fmt.Println(k, v)
}

Interval pe un șir: rune, nu octeți

for i, r := range s repetă pe punct de cod Unicode (rună), nu pe octet. Indicele i este decalajul octet al începutului runei.

Go
for i, r := range "èé" {
    fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)

Pentru a itera pe octet, utilizați indexarea clasică:

Go
s := "ciao"
for i := 0; i < len(s); i++ {
    fmt.Println(s[i])  // byte (uint8)
}

Raza de acțiune pe un canal

Iterează până când canalul este închis:

Go
ch := make(chan int)
go func() {
    for i := 0; i < 3; i++ { ch <- i }
    close(ch)
}()
for v := range ch {
    fmt.Println(v)
}

Vom săpă mai adânc în modulul Concurență.

Încearcă

Exercițiu#go.m2.l3.e1
Încercări: 0Se încarcă…

Tipăriți indexul și valoarea fiecărui element de numere folosind for-range.

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Exercițiu#go.m2.l3.e2
Încercări: 0Se încarcă…

Însumați în total toate valorile numerelor ignorând indexul.

Se încarcă editorul...
Afișează indiciu

Folosiți `_` pentru a renunța la index.

Soluție disponibilă după 3 încercări

Quiz#go.m2.l3.e3
Gata

Ce reprezintă prima variabilă din `for k, v := range m` când m este o hartă?

Go
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }
Opțiuni de răspuns

Recapitulare

  • for k, v := range coll cu domeniul de aplicare clar: aruncați cu _ ceea ce nu utilizați.
  • Slice/matrice: index + COPIE a valorii. A muta, indexează.
  • Hartă: cheie + valoare, ordine randomizat la fiecare cursă.
  • Șir: intervalul iterează pe rună (punct de cod), nu pe octet.
  • Canal: iterează în timp ce canalul este deschis; închis cu close().