Go:异步启动 HTTP 服务器,但如果启动失败则出现 return 错误

Go: start HTTP server asynchronously but return error if startup failed

我想在 goroutine 中启动一个 HTTP 服务器,但如果启动失败,它的父 return 就会出错。有这样做的好方法吗?我尝试在通道中传递错误。但是,即使服务器成功启动,这也会使父级阻塞(除非我引入任意超时来监听该通道)。

func Start() error {
  go func() {
     srv = &http.Server{...}
     if err := srv.ListenAndServe(); err != http.ErrServerClosed {
       // return err from Start()
     }
  }
  // return nil if server started successfully
}

ListenAndServe 是一个辅助函数,它打开一个监听套接字,然后在该套接字上提供连接。

ListenAndServer 中的启动错误在函数的侦听部分。在主 goroutine 上创建监听器并在那里处理错误。 运行 goroutine 中的服务器:

l, err := net.Listen("tcp", ":8080") // adjust arguments as needed.
if err != nil {
    // Handle error.
}

srv = &http.Server{...}
go func() {
   if err := srv.Serve(l); err != nil {
       // Handle non-startup errors here.
 }()

如果您想坚持该模式,请通过通道发送 nil 错误以表示初始化成功或关闭通道。这两个动作都可以被主线程拾取并且它会停止被阻塞。