MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Cicluri

Ciclurile permit, în funcție de o anumită condiție, să se execute anumite acțiuni de mai multe ori. În Go, există un singur tip de ciclu - ciclul for, care poate lua forme diferite. Definiția formală a acestui ciclu este:

for [inițializarea contorului]; [condiția]; [modificarea contorului] {
    // acțiuni
}

De exemplu, să afișăm pătratele numerelor folosind un ciclu:

package main
import "fmt"

func main() {
    for i := 1; i < 10; i++ {
        fmt.Println(i * i)
    }
}

Declarația ciclului for este împărțită în trei părți. La început se face inițializarea contorului: i := 1. Practic, aceasta reprezintă declararea unei variabile care va fi utilizată în cadrul ciclului. În acest caz, contorul este i, iar valoarea sa inițială este 1.

A doua parte reprezintă condiția: i < 10. Atât timp cât această condiție este adevărată, adică returnează true, ciclul va continua.

A treia parte reprezintă modificarea (creșterea) contorului cu 1.

În corpul ciclului, se afișează pătratul valorii lui i pe consolă.

Astfel, ciclul se va executa de 9 ori, până când valoarea lui i va ajunge la 10. Fiecare execuție a ciclului se numește o iterație. În acest caz, vor fi 9 iterații. La final, vom obține următorul output pe consolă:

1
4
9
16
25
36
49
64
81

Nu este necesar să specificăm toate condițiile la definirea ciclului. De exemplu, putem muta declararea variabilei în afara ciclului:

var i = 1
for ; i < 10; i++ {
    fmt.Println(i * i)
}

Putem elimina modificarea contorului din partea de modificare și să o lăsăm în corpul ciclului:

var i = 1
for ; i < 10; {
    fmt.Println(i * i)
    i++
}

Dacă ciclul folosește doar condiția, putem să-l scriem astfel:

var i = 1
for i < 10 {
    fmt.Println(i * i)
    i++
}

Cicluri imbricate

Ciclurile pot fi imbricate, adică pot fi plasate unul în interiorul altuia. De exemplu, să afișăm pe consolă tabela înmulțirii:

package main
import "fmt"

func main() {
    for i := 1; i < 10; i++ {
        for j := 1; j < 10; j++ {
            fmt.Print(i * j, "\t")
        }
        fmt.Println()
    }
}

Output-ul va fi:

1	2	3	4	5	6	7	8	9	
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

Iterarea peste aranjamente

Pentru a itera peste elementele unui aranjament, putem folosi următoarea formă a ciclului for:

for index, value := range array {
    // acțiuni
}

Prin iterare, putem obține atât indicele fiecărui element, cât și valoarea acestuia. De exemplu, să iterăm printr-un aranjament de șiruri:

var users = [3]string{"Tom", "Alice", "Kate"}
for index, value := range users {
    fmt.Println(index, value)
}

Output-ul va fi:

0 Tom
1 Alice
2 Kate

Dacă nu dorim să folosim valorile sau indicii elementelor, putem folosi un caracter de liniuță pentru a le omite. De exemplu, dacă nu avem nevoie de indici:

for _, value := range users {
    fmt.Println(value)
}

De asemenea, putem utiliza și versiunea standard a ciclului for pentru a itera printr-un aranjament:

var users = [3]string{"Tom", "Alice", "Kate"}
for i := 0; i < len(users); i++ {
    fmt.Println(users[i])
}

În acest caz, contorul i joacă rolul de indice. Ciclul se execută până când contorul i devine egal cu lungimea aranjamentului, care poate fi obținută cu funcția len().

Operatorii break și continue

Poate apărea situația în care trebuie să terminăm o iterație a ciclului într-un anumit punct, fără a executa toate instrucțiunile din interiorul ciclului și să trecem direct la următoarea iterație. În acest caz, putem folosi operatorul continue. De exemplu, într-un aranjament pot exista atât numere pozitive, cât și negative. Să presupunem că dorim suma doar a numerelor pozitive, așa că, dacă întâlnim un număr negativ, putem trece la următoarea iterație folosind continue:

var numbers = [10]int{1, -2, 3, -4, 5, -6, -7, 8, -9, 10}
var sum = 0

for _, value := range numbers {
    if value < 0 {
        continue        // trecem la următoarea iterație
    }
    sum += value
}
fmt.Println("Sum:", sum)    // Sum: 27

Operatorul break iese complet din ciclu:

var numbers = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var sum = 0

for _, value := range numbers {
    if value > 4 {
        break       // dacă numărul este mai mare de 4, ieșim din ciclu
    }
    sum += value
}
fmt.Println("Sum:", sum)    // Sum: 10