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

preload
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))
}
  1. 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)
  2. if preload

    9if preloadtrue {10  inbox(chan string)(⟨addr A⟩) <- "message"11}
  3. 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
  1. 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