http.Serve 要么在调用后立即返回错误,要么在成功执行时阻塞。
我怎样才能让它在它自己的 goroutine 中阻塞它呢?我目前有以下代码:
func serveOrErr(l net.Listener, handler http.Handler) error {
starting := make(chan struct{})
serveErr := make(chan error)
go func() {
starting <- struct{}{}
if err := http.Serve(l, handler); err != nil {
serveErr <- err
}
}()
<-starting
select {
case err := <-serveErr:
return err
default:
return nil
}
}
这似乎是一个好的开始,并且在我的测试机器上工作,但我相信没有任何保证serveErr <- err会在之前调用,case err := <-serveErr因此如果http.Serve要产生错误,则会由于数据竞争导致不一致的结果。
呼啦一阵风
犯罪嫌疑人X
相关分类