134 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			134 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Switch in Go
							 | 
						|||
| 
								 | 
							
								localeTitle: Mudar em Go
							 | 
						|||
| 
								 | 
							
								---
# Mudar em Go
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								A instrução switch do Go é uma alternativa para `if` . Ele usa a seguinte sintaxe:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```go
							 | 
						|||
| 
								 | 
							
								fruit := "apple" 
							 | 
						|||
| 
								 | 
							
								 switch fruit { 
							 | 
						|||
| 
								 | 
							
								    case "banana": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and long.") 
							 | 
						|||
| 
								 | 
							
								    case "apple": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Red and round.") 
							 | 
						|||
| 
								 | 
							
								    case "lemon": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and round.") 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								A saída deste programa seria `Red and round.` .
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Primeiro, declaramos a variável `fruit` como `apple` . Em seguida, usamos a variável `fruit` como expressão de condição. Go compara o valor da `fruit` com os `cases` fornecidos assim:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   fruta == "banana" (falso)
							 | 
						|||
| 
								 | 
							
								*   fruta == "maçã" (verdadeiro)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Observe que o `lemon` não foi testado. Depois que uma avaliação retorna true, nenhum outro caso é tentado.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Como com `if` , você pode declarar variáveis temporárias na expressão de condição do switch:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```go
							 | 
						|||
| 
								 | 
							
								switch fruit := "apple"; fruit { 
							 | 
						|||
| 
								 | 
							
								    case "banana": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and long.") 
							 | 
						|||
| 
								 | 
							
								    case "apple": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Red and round.") 
							 | 
						|||
| 
								 | 
							
								    case "lemon": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and round.") 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								A variável `fruit` não estará acessível fora da instrução switch.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Default e outros casos
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Padrão
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								A palavra-chave `default` é o caso fallback quando nenhum outro caso retorna true:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```go
							 | 
						|||
| 
								 | 
							
								switch fruit := "grape"; fruit { 
							 | 
						|||
| 
								 | 
							
								    case "banana": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and long.") 
							 | 
						|||
| 
								 | 
							
								    case "apple": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Red and round.") 
							 | 
						|||
| 
								 | 
							
								    case "lemon": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and round.") 
							 | 
						|||
| 
								 | 
							
								    default: 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("New fruit: %s!", fruit) 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								A saída deste programa seria `New fruit: grape!` .
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Mesma ação para valores diferentes
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Uma lista de valores separados por vírgula para comparar o valor da expressão de condição com a mesma ação.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```go
							 | 
						|||
| 
								 | 
							
								switch fruit := "lemon"; fruit { 
							 | 
						|||
| 
								 | 
							
								    case "banana", "lemon": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow fruit.") 
							 | 
						|||
| 
								 | 
							
								    default: 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("This fruit is a color different than yellow.") 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Saída: `Yellow fruit.` .
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Nenhuma expressão
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Um switch sem expressão significa `switch true` . Esta é uma versão alternativa para uma cadeia else-if.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```go
							 | 
						|||
| 
								 | 
							
								fruit := "banana" 
							 | 
						|||
| 
								 | 
							
								 switch { 
							 | 
						|||
| 
								 | 
							
								    case fruit == "banana": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and long.") 
							 | 
						|||
| 
								 | 
							
								    default: 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("This is not a banana.") 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Isso avalia `true == (fruit == "banana")` , simpliefied para `true == true` , que retorna true.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Pausa
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Você pode quebrar o código em uma instrução switch para pular qualquer outro código.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```go
							 | 
						|||
| 
								 | 
							
								appleColor := "green" 
							 | 
						|||
| 
								 | 
							
								 switch fruit := "apple"; fruit { 
							 | 
						|||
| 
								 | 
							
								    case "banana": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and long.") 
							 | 
						|||
| 
								 | 
							
								    case "apple": 
							 | 
						|||
| 
								 | 
							
								        if appleColor == "green" { 
							 | 
						|||
| 
								 | 
							
								            fmt.Printf("This apple is green!") 
							 | 
						|||
| 
								 | 
							
								            break 
							 | 
						|||
| 
								 | 
							
								        } 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("This apple is tasty!") 
							 | 
						|||
| 
								 | 
							
								    case "lemon": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and round.") 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Saída: `This apple is green!` .
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Cair em
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Pule para o próximo caso, independentemente de sua condição ser avaliada como verdadeira.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```go
							 | 
						|||
| 
								 | 
							
								switch fruit := "banana"; fruit { 
							 | 
						|||
| 
								 | 
							
								    case "banana": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and long.") 
							 | 
						|||
| 
								 | 
							
								        fallthrough 
							 | 
						|||
| 
								 | 
							
								    case "apple": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Red and round.") 
							 | 
						|||
| 
								 | 
							
								    case "lemon": 
							 | 
						|||
| 
								 | 
							
								        fmt.Printf("Yellow and round.") 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Saída: `Yellow and long.` E `Red and round.` .
							 |