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