137 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			137 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | title: Switch in Go | ||
|  | --- | ||
|  | 
 | ||
|  | # Switch in Go
 | ||
|  | 
 | ||
|  | Go's switch statement is an alternative to `if`. It uses the following syntax: | ||
|  | 
 | ||
|  | ```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.") | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | This program's output would be `Red and round.`. | ||
|  | 
 | ||
|  | First, we declare the variable `fruit` as `apple`. Then we use the `fruit` variable as the condition expression. | ||
|  | Go compares the value of `fruit` with the `cases` provided like this: | ||
|  | 
 | ||
|  | - fruit == "banana" (false) | ||
|  | - fruit == "apple" (true) | ||
|  | 
 | ||
|  | Notice `lemon` was not tested. After an evaluation returns true, no more cases are tried. | ||
|  | 
 | ||
|  | As with `if`, you can declare temporary variables on the switch`s condition expression: | ||
|  | 
 | ||
|  | ```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.") | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | The variable `fruit` will not be accessible outside of the switch statement. | ||
|  | 
 | ||
|  | ## Default and other cases
 | ||
|  | 
 | ||
|  | ### Default
 | ||
|  | 
 | ||
|  | The `default` keyword is the fall back case when no other cases return 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) | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | This program's output would be `New fruit: grape!`. | ||
|  | 
 | ||
|  | ### Same action for different values
 | ||
|  | 
 | ||
|  | A comma separated list of values to compare the condition expression value to, with the same action. | ||
|  | 
 | ||
|  | ```go | ||
|  | switch fruit := "lemon"; fruit { | ||
|  |     case "banana", "lemon": | ||
|  |         fmt.Printf("Yellow fruit.") | ||
|  |     default: | ||
|  |         fmt.Printf("This fruit is a color different than yellow.") | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | Output: `Yellow fruit.`. | ||
|  | 
 | ||
|  | ### No expression
 | ||
|  | 
 | ||
|  | A switch with no expression means `switch true`. This is an alternate version to an else-if chain. | ||
|  | 
 | ||
|  | ```go | ||
|  | fruit := "banana" | ||
|  | switch { | ||
|  |     case fruit == "banana": | ||
|  |         fmt.Printf("Yellow and long.") | ||
|  |     default: | ||
|  |         fmt.Printf("This is not a banana.") | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | This evaluates `true == (fruit == "banana")`, simpliefied to `true == true`, which returns true. | ||
|  | 
 | ||
|  | ### Break
 | ||
|  | 
 | ||
|  | You can break code in a switch statement to skip any more code. | ||
|  | 
 | ||
|  | ```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.") | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | Output: `This apple is green!`. | ||
|  | 
 | ||
|  | ### Fallthrough
 | ||
|  | 
 | ||
|  | Skip to the next case, whether its condition evaluates to true. | ||
|  | 
 | ||
|  | ```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.") | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | Output: `Yellow and long.` AND `Red and round.`. |