Loop por meio de dados com para expressões
Outro fluxo de controle comum é um loop. O Go usa apenas uma construção de looping, que é um loop for
. Mas os loops podem ser representados de mais de uma maneira. Nesta parte, você conhecerá os padrões de loop compatíveis com o Go.
Sintaxe básica de loop for
Assim como as instruções if
e switch
, as expressões loop for
não exigem parênteses. Já as chaves “{ }”são necessárias.
Pontos-e-vírgulas (;
) separam os três componentes dos loops for
:
- Uma instrução inicial que é executada antes da primeira iteração (opcional).
- Uma expressão de condição que é avaliada antes de cada iteração. O loop para quando essa condição é
false
. - Uma repetição que é executada no final de cada iteração (opcional).
Como se pode ver, o loop for
no Go é semelhante ao loop for
em linguagens de programação como C, Java e C#.
Em sua forma mais simples, um loop for
tem esta aparência:
func main() {
sum := 0
for i := 1; i <= 100; i++ {
sum += i
}
fmt.Println("sum of 1..100 is", sum)
}
Vamos ver de que outras maneiras se podem escrever loops no Go.
Instruções prévias e posteriores vazias
Em algumas linguagens de programação, a palavra-chave while
é usada para escrever padrões de loop onde apenas a expressão de condição é necessária. O Go não tem palavras-chave while
. No entanto, é possível usar um loop for
como alternativa e aproveitar o fato de que o Go torna as pré-declarações e pós-declarações opcionais.
Use o seguinte trecho de código para confirmar que o loop for
pode ser usado sem as instruções prévias e posteriores.
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var num int64
rand.Seed(time.Now().Unix())
for num != 5 {
num = rand.Int63n(15)
fmt.Println(num)
}
}
Desde que a variável num
contenha um valor diferente de 5
, o programa imprimirá um número aleatório.
Loops infinitos e instruções break
Outro padrão de loop que pode ser escrito no Go é o loop infinito. Nesse caso, não se escreve uma expressão de condição nem instruções prévias ou posteriores. Em vez disso, escreve-se a saída do loop. Caso contrário, a lógica nunca será encerrada. Para fazer com que a lógica saia de um loop, use a palavra-chave break
.
Para escrever um loop infinito adequado, siga a palavra-chave for
de chaves, desta forma:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var num int32
sec := time.Now().Unix()
rand.Seed(sec)
for {
fmt.Print("Writing inside the loop...")
if num = rand.Int31n(10); num == 5 {
fmt.Println("finish!")
break
}
fmt.Println(num)
}
}
Toda vez que você executar esse código, obterá uma saída diferente.
Instruções continue
No Go, é possível usar a palavra-chave continue
para ignorar a iteração atual de um loop. Essa palavra-chave pode ser usada, por exemplo, para executar uma validação antes de o loop continuar. Ou use-a quando estiver escrevendo um loop infinito e precisar aguardar que um recurso fique disponível.
Este exemplo usa o módulo continue
:
package main
import "fmt"
func main() {
sum := 0
for num := 1; num <= 100; num++ {
if num%5 == 0 {
continue
}
sum += num
}
fmt.Println("The sum of 1 to 100, but excluding numbers divisible by 5, is", sum)
}
Este exemplo tem um loop for que itera de 1 a 100, adicionando o número atual à soma em cada iteração. Todo número divisível por 5 é ignorado na iteração atual do loop e não é adicionado à soma.