Interrompendo Loops Aninhados
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 2 de 68.
Ao trabalhar com loops aninhados, uma instrução break comum sai apenas do loop mais interno. No entanto, Go fornece rótulos (labels) que permitem sair de loops externos diretamente, oferecendo controle preciso sobre estruturas de loop complexas.
Um rótulo é um identificador seguido por dois pontos que você coloca antes de um loop. Você pode então usar break seguido pelo nome do rótulo para sair daquele loop específico, mesmo de dentro de loops aninhados.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
break outer
}
fmt.Printf("i=%d, j=%d\n", i, j)
}
}Neste exemplo, quando a condição i == 1 && j == 1 é atendida, break outer sai de ambos os loops, interno e externo, imediatamente. Isso é particularmente útil ao pesquisar em estruturas de dados 2D, onde você deseja interromper a pesquisa inteiramente assim que encontrar o que está procurando.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilNeste desafio, você praticará o uso de instruções break rotuladas para sair de loops aninhados ao pesquisar em uma grade 2D. Você precisa encontrar um número de destino específico na grade e interromper a pesquisa imediatamente assim que o encontrar.
Você receberá duas entradas:
- Uma string representando as dimensões da grade no formato
"rows,cols"(ex:"3,4") - Uma string representando o número de destino a ser pesquisado (ex:
"7")
Você recebeu a seguinte grade 2D de números:
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}Sua tarefa é:
- Analisar as dimensões da primeira entrada para determinar quantas linhas e colunas pesquisar
- Analisar o número de destino da segunda entrada
- Usar loops aninhados com um
breakrotulado para pesquisar na grade - Quando encontrar o número de destino, imprimir
"Found [target] at position ([row], [col])"e sair imediatamente de ambos os loops usando o break rotulado - Se você concluir a pesquisa sem encontrar o destino, imprimir
"Target [target] not found"
A posição deve ser informada usando indexação baseada em 0 (a primeira linha é 0, a primeira coluna é 0).
Folha de consulta
Rótulos (labels) permitem que você saia de loops externos de dentro de loops aninhados. Um rótulo é um identificador seguido por dois pontos colocado antes de um loop.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if condition {
break outer // sai de ambos os loops
}
}
}Use break seguido pelo nome do rótulo para sair daquele loop específico, mesmo de estruturas profundamente aninhadas. Isso é útil ao pesquisar dados 2D e você deseja parar completamente assim que encontrar seu alvo.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Ler a entrada
var dimensions string
var targetStr string
fmt.Scanln(&dimensions)
fmt.Scanln(&targetStr)
// Analisar dimensões
dimParts := strings.Split(dimensions, ",")
rows, _ := strconv.Atoi(dimParts[0])
cols, _ := strconv.Atoi(dimParts[1])
// Analisar o número alvo
target, _ := strconv.Atoi(targetStr)
// Grade predefinida
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
// TODO: Escreva seu código abaixo
// Use loops aninhados com um break rotulado para procurar o alvo
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos