Channels and Select
Nonblocking Receive
A default case lets select continue when no channel receive is ready.
default case
A `default` case prevents a `select` from blocking when no channel operation can proceed.
Nonblocking Receive
nonblocking_receive.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
func main() {
var preload = true
inbox := make(chan string, 1)
if preload {
inbox <- "message"
}
status := ""
select {
case value := <-inbox:
status = "received " + value
default:
status = "nothing ready"
}
fmt.Println("preload=", preload)
fmt.Println("status=", status)
fmt.Println("remaining=", len(inbox))
}
package main
import "fmt"
func main() {
var preload = false
inbox := make(chan string, 1)
if preload {
inbox <- "message"
}
status := ""
select {
case value := <-inbox:
status = "received " + value
default:
status = "nothing ready"
}
fmt.Println("preload=", preload)
fmt.Println("status=", status)
fmt.Println("remaining=", len(inbox))
}
preload ← true, inbox ← (chan string)(⟨addr A⟩)
5func main() {6 var preload→ true = true //@preload=false7 inbox→ (chan string)(⟨addr A⟩) := make(chan string, 1)if preload
9if preloadtrue {10 inbox(chan string)(⟨addr A⟩) <- "message"11}status ← ""
13 status→ "" := ""14 select {15 case value := <-inbox:16 status→ "received message" = "received " + value"message"17 default:18 status = "nothing ready"19 }2021 fmt.Println("preload=", preloadtrue)22 fmt.Println("status=", status"received message")23 fmt.Println("remaining=", len(inbox(chan string)(⟨addr A⟩)))24}outputpreload= true status= received message remaining= 0
preload ← false, inbox ← (chan string)(⟨addr A⟩), status ← ""
5func main() {6 var preload→ false = false7 inbox→ (chan string)(⟨addr A⟩) := make(chan string, 1)89 if preload {10 inbox <- "message"11 }1213 status→ "" := ""14 select {15 case value := <-inbox:16 status = "received " + value17 default:18 status = "nothing ready"19 }2021 fmt.Println("preload=", preloadfalse)22 fmt.Println("status=", status"nothing ready")23 fmt.Println("remaining=", len(inbox(chan string)(⟨addr A⟩)))24}outputpreload= false status= nothing ready remaining= 0