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.`.
 |