Я нашел следующий код в net/http/httptest и задаюсь вопросом, что делает пустой оператор select в Go.
go s.Config.Serve(s.Listener)
if *serve != "" {
fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
select {}
}
Ответ 1
Пустой оператор select{} блокирует неопределенно, т.е. навсегда. Это похоже и на практике эквивалентно пустой for{} оператора.
Ответ 2
В Mac OS X, в Go, for { } будет зависеть от CPU% до max, а состояние состояния будет running
select { }, с другой стороны, не приведет к тому, что CPU% будет максимальным, а состояние состояния будет sleeping
Ответ 3
Пустой оператор select просто блокирует текущий goroutine.
Что касается того, почему вы это сделаете, вот одна из причин. Этот фрагмент эквивалентен
if *serve != "" {
fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
s.Config.Serve(s.Listener)
} else {
go s.Config.Serve(s.Listener)
}
Лучше, чтобы не было потраченного впустую горутина. Это хуже в том, что теперь есть повторение кода. Автор оптимизирован для меньшего количества повторений кода над потерянным ресурсом. Обратите внимание, однако постоянный блок goroutine является тривиальным для обнаружения и может иметь нулевую стоимость по дублирующей версии.