
Esse post faz parte de uma série onde pretendo compartilhar o básico essencial para desenvolver com GoLang.
Esse em particular é um complemento doGolang básico - Controle de Fluxo
Agora que já vimos como utilizarIF
,SWITCH
eFOR
vamos ver algumas palavras reservadas do Go que são utilizadas para interromper ou acelerar a iteração do código.
continue
A palavra reservadacontinue
é específica para ser utilizada comfor
, e serve para pular para a próxima iteração:
funcmain(){produtos:=[]produto{{nome:"Produto Final",cor:verde,status:publicado,criado:time.Now(),},{nome:"Produto Teste",cor:verde,status:rascunho,criado:time.Now(),},}for_,p:=rangeprodutos{ifp.status==publicado{continue}fmt.Println(p)}}
Executando esse código verá que somente oProduto Teste
é impresso nofor
.
break
Essa palavra reservada pode ser utilizada emfor
,switch
eselect
. E ela serve para interromper a iteração do bloco e seguir para próxima instrução do código.
// nesse for nenhum produto será impressofor_,p:=rangeprodutos{ifp.status==publicado{break}fmt.Println(p)}fmt.Println("Loop terminado")
p:=produto{nome:"Produto Teste",cor:verde,status:rascunho,criado:time.Now(),}// nenhum case será executadoswitchp.status{casepublicado:fmt.Println("bloco publicado",p)caserascunho:ifp.cor==verde{break}fmt.Println("bloco rascunho",p)casecongelado:fmt.Println("bloco congelado",p)}fmt.Println("switch terminado")
fallthrough
Essa é específica para ser utilizada comswitch
, em Go cadacase
doswitch
é exclusivo. Diferente de outras linguagens que caso precise ser exclusivo você precisa combinar ocase
+break
.
Mas caso você tenha a necessidade de executar o mesmo case para mais de uma condição, pode fazer uso dofallthrough
que transfere o controle para ocase
seguinte:
// nesse exemplo ambos os cases serão executadosswitchp.status{caserascunho:fmt.Println("bloco rascunho")fallthroughcasecongelado:fmt.Println("bloco congelado")fmt.Println("aplica lógica compartilhada entre produtos congelados e rascunhos")}fmt.Println("switch terminado")
Label comcontinue
ebreak
Em Go os blocos de códigos podem ter labels e podemos combinar o uso das palavras reservadas de controle com os labels. Isso acaba sendo útil quando temos operações aninhadas. Por exemplo:
funcmain(){produtos:=[]produto{{nome:"Produto Final",cor:verde,status:publicado,criado:time.Now(),},{nome:"Produto Teste",cor:verde,status:rascunho,criado:time.Now(),},}for_,p:=rangeprodutos{switchp.status{casepublicado:breakcaserascunho:fmt.Println("bloco rascunho")fallthroughcasecongelado:fmt.Println("aplica lógica compartilhada entre produtos congelados e rascunhos")}fmt.Println("aplica regra para produtos não publicados")}fmt.Println("Loop terminado")}
Se você executar o código vai perceber que o break do switch não interrompe a execução do for. Com o uso de label fica assim:
loopDeProduto:for_,p:=rangeprodutos{switchp.status{casepublicado:breakloopDeProdutocaserascunho:fmt.Println("bloco rascunho")fallthroughcasecongelado:fmt.Println("aplica lógica compartilhada entre produtos congelados e rascunhos")}fmt.Println("aplica regra para produtos não publicados")}fmt.Println("Loop terminado")
Ou seja, com label você consegue controlar a iteração do for de dentro do switch. Mas poderia ser doisfor
aninhados também, ou qualquer outro bloco aninhado.
Bom esses recursos de controle são importantes de saber que existem, porém na minha opinião eles são bem evitáveis.
No geral quando você está fazendo operações aninhadas e precisando fazer um controle tão detalhado é um grande sinal de que talvez o seu código não esteja tão simples.
Sempre considere a expressividade do código, não o faça funcionar a qualquer custo!
Resumo
continue
pula para próxima execução dofor
.break
interrompe execução do bloco.fallthrough
transfere controle para o case seguinte.- Labels te possibilitam controlar de blocos aninhados.
- Sempre considere a expressividade do seu código.
Top comments(0)
For further actions, you may consider blocking this person and/orreporting abuse