Подтвердить что ты не робот

Что делает пустой выбор?

Я нашел следующий код в net/http/httptest и задаюсь вопросом, что делает пустой оператор select в Go.

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

Ответ 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 является тривиальным для обнаружения и может иметь нулевую стоимость по дублирующей версии.