Channels and Select
Select With a Ready Case
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
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)
}
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)if route == "primary"
10if route"primary" == "primary" {11 primary(chan string)(⟨addr A⟩) <- "from primary"12} else {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
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)else
11 primary <- "from primary"12} else {13 backup(chan string)(⟨addr B⟩) <- "from backup"14}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