gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:31:29 25 4
gpt4 key购买 nike

我正在尝试在 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()
}

当我启动应用程序时,我没有看到任何打印到控制台的信息,而我希望看到的是:

记录 API 服务运行 @ http://localhost:4000

当我将端口更改为无效端口时,以下输出会打印到控制台:

fatal error :所有 goroutines 都在休眠 - 死锁!

goroutine 1 [chan receive]:main.main()...app.go:45 +0x107退出状态 2

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

最佳答案

除非您更改代码中的逻辑或分别使用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
}

参见 https://stackoverflow.com/a/44598343/4792552 .

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

关于go - HTTP 服务器启动成功时如何通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53332667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com