我在net/http/httptest
中找到了以下代码,并想知道Go中空select
语句的作用。
go s.Config.Serve(s.Listener)
if *serve != "" {
fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
select {}
}
答案 0 :(得分:20)
空select{}
语句无限期地阻塞,即永远阻塞。它类似于空for{}
语句。
在大多数(全部?)支持的Go架构中,空选择将产生CPU。空的for循环不会,即它将在100%CPU上“旋转”。
答案 1 :(得分:12)
在Mac OS X上,在Go中,for { }
会导致CPU%达到最大值,进程的状态将为running
select { }
不会导致CPU%达到最大值,并且进程的状态将为sleeping
答案 2 :(得分:5)
空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很容易检测到,并且复制版本的成本可能为零。