Conteúdo

Condicionais

As instruções condicionais determinam ao programa avaliar se uma certa condição está sendo atendida. Se a condição for atendida, o programa irá executar o código específico, mas se não for cumprida, o programa passará adiante para o código que vem adiante.

Esse tipo de instrução faz parte de todas as linguagens de programação. Em Go é muito similar a C ou Java exceto por obrigatoriamente não haver parênteses e obrigatoriamente haver chaves mesmo se houver apenas uma linha de código entre as chaves.

If

A instrução if

if é uma instrução que possui uma condição booleana que executa um bloco de código se a condição for avaliada como true e executa um bloco else alternativo se a condição for avaliada como false.

Sintaxe da instrução if:

if condição {
    // Instruções caso 'condição' seja verdadeira
}

Se a condição for verdadeira, as linhas de código entre as chaves { } serão executadas.

Exemplo de uma instrução condicional simples, a instrução if, que avaliará se uma instrução é verdadeira ou falsa e executará o código apenas no caso em que a instrução for verdadeira:

package main

import (
	"fmt"
)

func main() {
	idade := 20

	if idade >= 18 {
		fmt.Println("Maior de idade")
	}
}

Criamos e atribuímos à variável idade o valor inteiro '20' e estamos usando a instrução if para verificar se é maior ou igual (>=) a 18 e, caso atenda esta condição, o programa vai imprimir na tela a frase "Maior de Idade".

A instrução if else

A instrução if possui uma instrução opcional else que será executada se a condição na instrução if for avaliada como false.

Sintaxe:

if condição {
    // Instruções caso 'condição' seja verdadeira
} else {
    // Instruções caso 'condição' seja falsa
}

No trecho acima, se a condição for avaliada como false, as linhas de código entre else { } serão executadas.

Exemplo de uma instrução condicional composta utilizando if e else:

package main

import (
	"fmt"
)

func main() {
	idade := 20

	if idade < 18 {
		fmt.Println("Menor de idade")
	} else {
		fmt.Println("Maior de idade")
	}
}

No código acima, em vez de apenas retornar se a condição for true como fizemos no exemplo anterior, criamos uma instrução else que será executada se a condição for false. Nesse caso, como 20 é maior que 18, a condição testada é false e as linhas de código dentro da instrução else serão executadas. O programa acima irá imprimir "Maior de Idade".

A instrução else deve começar na mesma linha após a chave de fechamento } da instrução if. Do contrário, o compilador não permitirá o funcionamento e retornará um erro syntax error: unexpected else, expecting }. O motivo é o modo como Go insere ponto-e-vírgulas automaticamente. Você pode ler sobre a regra de inserção de ponto e vírgula aqui.

Mais sobre a regra de inserção de ponto e vírgula

Nas regras, é especificado que um ponto-e-vírgula será inserido após a chave de fechamento }, se esse for o token final da linha. Assim, um ponto-e-vírgula é inserido automaticamente após as chaves de fechamento da instrução if pelo compilador Go. Portanto, é um requisito sintático colocar o else na mesma linha após a chave de fechamento da instrução if }.

A instrução if, else if, else

A instrução if também possui componentes else if e opcionais else. A sintaxe é a seguinte:

if condição1 {  
    // Instruções caso 'condição1' seja verdadeira
} else if condição2 {
    // Instruções caso 'condição2' seja verdadeira
} else {
    // Instruções caso ambas sejam falsas
}

As condições são avaliadas quanto à verdade de cima para baixo. Na declaração acima, se condição1 for verdadeira, as linhas de código entre if condição1 { e a chave de fechamento } são executadas.

Se condição1 for falsa e condição2 for verdadeira, as linhas de código entre else if condição2 { e a próxima chave de fechamento } serão executadas.

Se tanto condição1 quanto condição2 forem falsas, as linhas de código na instrução else, entre else { e a chave de fechamento } serão executadas.

Em geral, qualquer que seja a condição if ou else if avaliada como true, seu bloco de código correspondente é executado. Se nenhuma das condições for verdadeira, o bloco else é executado. Pode haver qualquer número de declarações else if.

Exemplo utilizando else if:

package main

import (
	"fmt"
)

func main() {
	numero1 := 20
	numero2 := 20

	if numero1 < numero2 {
		fmt.Println("O numero1 é menor que o numero2")
	} else if (numero1 > numero2) {
		fmt.Println("numero1 é maior que o numero2")
	} else {
		fmt.Println("numero1 e numero2 são iguais")
	}
}

Neste caso existem 3 possibilidades e a que será executada é a que está no else, e vai imprimir "numero1 e numero2 são iguais".

Veja que as instruções if podem ou não ter sua condicional entre parênteses. Normalmente elas são escritas sem os parênteses e no caso do else if colocamos apenas para exemplificar que pode ser utilizado.

If com atribuição

Há mais uma forma de utilizar o if que inclui uma instrução de atribuição abreviada opcional que é executada antes que a condição seja avaliada. Sua sintaxe é:

if atribuição-declaração; condição {
    // Instruções caso 'condição' seja verdadeira
}

No código acima, a atribuição-declaração é executada primeiro, antes que a condição seja avaliada.

Exemplo:

package main

import (
	"fmt"
)

func main() {
	if idade := 20; idade < 18 {
		fmt.Println("Menor de idade")
	} else {
		fmt.Println("Maior de idade")
	}
}

No programa acima, idade é inicializada na instrução if. Uma coisa a ser observada é que idade está disponível apenas para acesso de dentro do if e else, ou seja, o escopo de idade é limitado a esses blocos. Se tentarmos acessar idade de fora do if ou else, receberemos um erro de compilação undefined: idade.

Exemplo de código que tenta acessar idade fora de seu escopo:

package main

import (
	"fmt"
)

func main() {
	if idade := 20; idade < 18 {
		fmt.Println("Menor de idade")
	} else {
		fmt.Println("Maior de idade")
	}

	fmt.Println(idade)
}

Tente rodar o código acima para ver o erro de compilação, você visualizará uma mensagem similar a: ./prog.go:14:14: undefined: idade

Essa sintaxe geralmente é útil quando declaramos uma variável para fins de uso somente nas instruções if e else, e seu uso garante que o escopo da variável esteja limitado aos blocos de condicionais adjacentes à sua declaração.

Idiomático Go

Vimos várias implementações de if + else e, inclusive, passamos por mais de uma maneira de escrever o mesmo programa. Por exemplo, vimos mais de uma forma de escrever um programa que verifica se a idade é maior que 18 usando if e else com construções diferentes.

Mas qual é a forma idiomática de codificar condicionais em Go? Na filosofia dessa linguagem, é melhor evitar desvios desnecessários e indentação de código. Também é considerado mais idiomático retornar o mais cedo possível. A maneira mais idiomática de escrever o programa acima na filosofia de Go seria evitando o else, e retornando o mais cedo possível.

Exemplo de código idiomático:

package main

import (
	"fmt"
)

func main() {
	idade := 10
	if idade < 18 {
		fmt.Println("Menor que 18, não pode prosseguir")
		return
	}
	fmt.Println("Maior de idade")
}

No código acima, assim que descobrimos que idade é menor que 18, retornamos imediatamente. Isso evita o uso de instrução else que é desnecessária.

Switch

<em breve>

Last updated