A select chooses a case that can proceed; this example keeps only one case ready.

select `select` waits on channel operations. If only one case is ready, that case is deterministic.

Select With a Ready Case

route
select_ready.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func main() {
	var route = "primary"
	primary := make(chan string, 1)
	backup := make(chan string, 1)

	if route == "primary" {
		primary <- "from primary"
	} else {
		backup <- "from backup"
	}

	chosen := ""
	select {
	case chosen = <-primary:
		fmt.Println("case=", "primary")
	case chosen = <-backup:
		fmt.Println("case=", "backup")
	}
	fmt.Println("chosen=", chosen)
}
package main

import "fmt"

func main() {
	var route = "backup"
	primary := make(chan string, 1)
	backup := make(chan string, 1)

	if route == "primary" {
		primary <- "from primary"
	} else {
		backup <- "from backup"
	}

	chosen := ""
	select {
	case chosen = <-primary:
		fmt.Println("case=", "primary")
	case chosen = <-backup:
		fmt.Println("case=", "backup")
	}
	fmt.Println("chosen=", chosen)
}
  1. route ← "primary", primary ← (chan string)(⟨addr A⟩), backup ← (chan string)(⟨addr B⟩)

    5func main() {6  var route→ "primary" = "primary" //@route="backup"7  primary→ (chan string)(⟨addr A⟩) := make(chan string, 1)8  backup→ (chan string)(⟨addr B⟩) := make(chan string, 1)
  2. if route == "primary"

    10if route"primary" == "primary" {11  primary(chan string)(⟨addr A⟩) <- "from primary"12} else {
  3. chosen ← ""

    16  chosen→ "" := ""17  select {18  case chosen = <-primary:19    fmt.Println("case=", "primary")20  case chosen = <-backup:21    fmt.Println("case=", "backup")22  }23  fmt.Println("chosen=", chosen"from primary")24}
    outputcase= primary
    chosen= from primary
  1. route ← "backup", primary ← (chan string)(⟨addr A⟩), backup ← (chan string)(⟨addr B⟩)

    5func main() {6  var route→ "backup" = "backup"7  primary→ (chan string)(⟨addr A⟩) := make(chan string, 1)8  backup→ (chan string)(⟨addr B⟩) := make(chan string, 1)
  2. else

    11  primary <- "from primary"12} else {13  backup(chan string)(⟨addr B⟩) <- "from backup"14}
  3. chosen ← ""

    16  chosen→ "" := ""17  select {18  case chosen = <-primary:19    fmt.Println("case=", "primary")20  case chosen = <-backup:21    fmt.Println("case=", "backup")22  }23  fmt.Println("chosen=", chosen"from backup")24}
    outputcase= backup
    chosen= from backup