HTTP 服务器启动成功时如何通知

Com*_*ity 5 go

我试图在 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

谁能指出我正确的方向,以便我知道我在这个实现中做错了什么?

Ber*_*ant 7

您不能这样做,除非您更改代码中的逻辑或单独使用ListenServe。因为ListenAndServe是阻塞函数。如果发生意外情况,它会返回一个错误。如果不是,它将继续阻止运行服务器。无论何时启动服务器都不会触发事件。

让我们跑ListenServe然后分开。

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)

请参阅/sf/answers/3121884041/

PSnet.Listen不会阻塞,因为它在后台运行。换句话说,它只是在操作系统级别生成一个套接字连接,并返回它的详细信息/ID。因此,您可以使用该 ID 将订单代理到该套接字。