Go switch statements choose a branch by matching a value.

switch A `switch` compares one expression against several `case` values.

Switch Statements

role
switch_intro.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func main() {
	var role = "editor"
	message := ""

	switch role {
	case "admin":
		message = "full access"
	case "editor":
		message = "can update"
	default:
		message = "read only"
	}

	fmt.Println("role=", role)
	fmt.Println("message=", message)
}
package main

import "fmt"

func main() {
	var role = "admin"
	message := ""

	switch role {
	case "admin":
		message = "full access"
	case "editor":
		message = "can update"
	default:
		message = "read only"
	}

	fmt.Println("role=", role)
	fmt.Println("message=", message)
}
package main

import "fmt"

func main() {
	var role = "guest"
	message := ""

	switch role {
	case "admin":
		message = "full access"
	case "editor":
		message = "can update"
	default:
		message = "read only"
	}

	fmt.Println("role=", role)
	fmt.Println("message=", message)
}
  1. role ← "editor", message ← ""

    5func main() {6  var role→ "editor" = "editor" //@role="admin", "guest"7  message→ "" := ""89  switch role {10  case "admin":11    message = "full access"12  case "editor":13    message→ "can update" = "can update"14  default:15    message = "read only"16  }1718  fmt.Println("role=", role"editor")19  fmt.Println("message=", message"can update")20}
    outputrole= editor
    message= can update
  1. role ← "admin", message ← ""

    5func main() {6  var role→ "admin" = "admin"7  message→ "" := ""89  switch role {10  case "admin":11    message→ "full access" = "full access"12  case "editor":13    message = "can update"14  default:15    message = "read only"16  }1718  fmt.Println("role=", role"admin")19  fmt.Println("message=", message"full access")20}
    outputrole= admin
    message= full access
  1. role ← "guest", message ← ""

    5func main() {6  var role→ "guest" = "guest"7  message→ "" := ""89  switch role {10  case "admin":11    message = "full access"12  case "editor":13    message = "can update"14  default:15    message→ "read only" = "read only"16  }1718  fmt.Println("role=", role"guest")19  fmt.Println("message=", message"read only")20}
    outputrole= guest
    message= read only

Follow the Switch

  1. role starts as editor.
  2. The admin case does not match.
  3. The editor case matches.
  4. message becomes can update, so the program prints role= editor and message= can update. | role | matching path | message | | --- | --- | --- | | editor | case "editor" | can update | | admin | case "admin" | full access | | guest | default | read only |

Exercise: switch_intro.go

Reproduce can update for editor, then use the pinned role variants to predict full access and read only.