我在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上“旋转”。
在Mac OS X上,在Go中,for { }
将导致CPU%达到最大值,并且进程的STATE将为running
另一方面,select { }
不会导致CPU%达到最大值,并且进程的状态将是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很容易检测到,并且复制版本的成本可能为零。