48

我在其中找到了以下代码net/http/httptest,想知道空select语句在 Go 中的作用。

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

3 回答 3

47

select{}语句永远阻塞。它类似于空for{}语句。

在大多数(全部?)支持的 Go 架构上,空选择将产生 CPU。一个空的 for 循环不会,即它会在 100% CPU 上“旋转”。

于 2013-09-06T16:03:19.407 回答
22

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

于 2016-05-05T05:52:50.603 回答
10

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。更糟糕的是,现在有代码重复。作者针对浪费的资源进行了优化,以减少代码重复。但是请注意,永久阻塞 goroutine 检测起来很简单,并且可能比复制版本的成本为零。

于 2013-09-06T16:16:32.280 回答