1 Visão geral das instruções de loop

Na linguagem Go, as instruções de loop permitem executar um bloco de código várias vezes. Quando é necessário realizar operações repetidamente, as instruções de loop tornam-se muito úteis. Por exemplo, é possível iterar através de cada elemento em uma array ou repetir uma operação até que uma condição específica seja atendida. Em Go, as instruções de loop são principalmente implementadas usando a palavra-chave for, que é a única instrução de loop na linguagem Go. O uso correto de instruções de loop é crucial para escrever um código eficiente e fácil de manter.

2 Conceitos básicos do loop for

2.1 Estrutura do loop for

O loop for na linguagem Go é composto por três partes:

  1. Declaração de inicialização: executada antes da primeira iteração, geralmente usada para declarar um contador de loop.
  2. Expressão de condição: avaliada antes de cada iteração. Se a condição for true, o corpo do loop é executado.
  3. Instrução pós-loop: executada após o bloco de código de cada iteração, geralmente usada para atualizar o contador do loop.

A sintaxe do loop for é a seguinte:

for declaração de inicialização; expressão de condição; instrução pós-loop {
    // código do corpo do loop
}

2.2 Exemplo simples do loop for

Vamos entender o processo de execução do loop for através de um exemplo simples:

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println("O valor de i é:", i)
    }
}

Neste exemplo, a variável i é inicializada como 0. O loop for verifica se a condição i < 5 é verdadeira. Se a condição for verdadeira, o corpo do loop é executado e o valor de i é impresso. Após a execução do corpo do loop, o valor de i é atualizado por i++ (operação de incremento), e em seguida o loop verifica novamente a condição até que o valor de i atinja 5, momento em que a condição se torna falsa e o loop for termina.

2.3 Outros exemplos de loop for

2.3.1 Loop infinito

Em Go, é possível omitir a declaração de inicialização, a expressão de condição e a instrução pós-loop do loop for, criando um loop infinito que será executado até ser terminado por uma instrução break ou por um valor de retorno de uma função.

for {
    // Código dentro de um loop infinito
    if algumaCondição {
        break // Sai do loop quando uma determinada condição é atendida
    }
}

2.3.2 Loop com apenas uma condição

Em Go, também é possível usar um loop for que contém apenas uma condição, semelhante a um loop while em outras linguagens de programação.

n := 0
for n < 5 {
    fmt.Println(n)
    n++
}

O código acima imprimirá 0 a 4 e o loop terminará quando n atingir 5.

2.3.3 Iterar através de uma array ou slice

Em Go, a palavra-chave range é usada para simplificar a iteração através de cada elemento de uma array ou slice.

itens := []int{1, 2, 3, 4, 5}
for índice, valor := range itens {
    fmt.Printf("Índice: %d, Valor: %d\n", índice, valor)
}

O código acima imprimirá o índice e o valor de cada elemento. Se apenas o valor dos elementos for necessário, é possível usar _ para ignorar o índice.

for _, valor := range itens {
    fmt.Printf("Valor: %d\n", valor)
}

Nota: O uso de arrays será explicado em detalhes nos capítulos subsequentes. Se não entender completamente esta parte, tudo bem desde que entenda que o loop for pode ser usado dessa maneira.

2.3.4 Iterar através de mapas

Ao iterar por um mapa, a combinação do loop for e da expressão range é muito poderosa. Isso permite obter cada par chave-valor do mapa.

cores := map[string]string{"vermelho": "#ff000", "verde": "#00ff00", "azul": "#000ff"}
for chave, valor := range cores {
    fmt.Printf("Chave: %s, Valor: %s\n", chave, valor)
}

Neste exemplo, imprimimos todas as chaves e seus valores correspondentes no mapa cores. Semelhante à iteração por slices, se você só precisar da chave ou do valor, pode optar por ignorar o outro.

Observação: O uso de mapas será explicado em detalhes nos capítulos subsequentes. Se você não entender esta parte, tudo bem, desde que entenda que o loop for pode ser usado dessa maneira.

3 Controlando o fluxo dos loops

3.1 Utilize break para encerrar um loop

Às vezes, precisamos sair do loop prematuramente quando uma condição específica é atendida, e nesses casos, a declaração break pode ser utilizada. Abaixo está um exemplo de uso do break para sair de um loop:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // Sai do loop quando i for igual a 5
        }
        fmt.Println("O valor de i é:", i)
    }
    // A saída conterá apenas valores de 0 a 4
}

3.2 Utilize continue para pular iterações

Em certas situações, podemos querer pular a iteração atual e prosseguir com a próxima iteração no loop. Isso pode ser alcançado utilizando a declaração continue. Aqui está um exemplo:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i%2 != 0 {
            continue // Pula esta iteração se i for ímpar
        }
        fmt.Println("Número par:", i)
    }
}