我试图在 Go 中启动一个 HTTP 服务器,当服务器启动时,应该打印一条消息,如果出现错误,应该打印一条错误消息。
鉴于以下代码:
const (
HTTPServerPort = ":4000"
)
func main() {
var httpServerError = make(chan error)
var waitGroup sync.WaitGroup
setupHTTPHandlers()
waitGroup.Add(1)
go func() {
defer waitGroup.Done()
httpServerError <- http.ListenAndServe(HTTPServerPort, nil)
}()
if <-httpServerError != nil {
fmt.Println("The Logging API service could not be started.", <-httpServerError)
} else {
fmt.Println("Logging API Service running @ http://localhost" + HTTPServerPort)
}
waitGroup.Wait()
}
Run Code Online (Sandbox Code Playgroud)
当我启动应用程序时,我没有看到任何打印到控制台的内容,我想在那里看到:
Logging API Service running @ http://localhost:4000
当我将端口更改为无效端口时,控制台会打印以下输出:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
...app.go:45 +0x107
exit status 2
谁能指出我正确的方向,以便我知道我在这个实现中做错了什么?
您不能这样做,除非您更改代码中的逻辑或单独使用Listen和Serve。因为ListenAndServe是阻塞函数。如果发生意外情况,它会返回一个错误。如果不是,它将继续阻止运行服务器。无论何时启动服务器都不会触发事件。
让我们跑Listen,Serve然后分开。
l, err := net.Listen("tcp", ":8080")
if err != nil {
// handle error
}
// Signal that server is open for business.
if err := http.Serve(l, rootHandler); err != nil {
// handle error
}
Run Code Online (Sandbox Code Playgroud)
PSnet.Listen不会阻塞,因为它在后台运行。换句话说,它只是在操作系统级别生成一个套接字连接,并返回它的详细信息/ID。因此,您可以使用该 ID 将订单代理到该套接字。