What does an empty select do?

The empty select statement just blocks the current goroutine.

As for why you'd do this, here is one reason. This snippet is equivalent

if *serve != "" {
  fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
  s.Config.Serve(s.Listener)
} else {
  go s.Config.Serve(s.Listener)
}

It's better in that there isn't a wasted goroutine. It's worse in that now there is code repetition. The author optimized for less code repetition over a wasted resource. Note however the permanently block goroutine is trivial to detect and may have zero cost over the duplicating version.


An empty select{} statement blocks forever. It is similar to an empty for{} statement.

On most (all?) supported Go architectures, the empty select will yield CPU. An empty for-loop won't, i.e. it will "spin" on 100% CPU.


On Mac OS X, in Go, for { } will cause the CPU% to max, and the process's STATE will be running

select { }, on the other hand, will not cause the CPU% to max, and the process's STATE will be sleeping

Tags:

Go