我在其中找到了以下代码net/http/httptest
,想知道空select
语句在 Go 中的作用。
go s.Config.Serve(s.Listener)
if *serve != "" {
fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
select {}
}
我在其中找到了以下代码net/http/httptest
,想知道空select
语句在 Go 中的作用。
go s.Config.Serve(s.Listener)
if *serve != "" {
fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
select {}
}
空select{}
语句永远阻塞。它类似于空for{}
语句。
在大多数(全部?)支持的 Go 架构上,空选择将产生 CPU。一个空的 for 循环不会,即它会在 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
空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 检测起来很简单,并且可能比复制版本的成本为零。