我以前曾写过关于在Go中使用正常关闭功能创建Web服务器的博客。

https://marcofranssen.nl/go-webserver-with-gracefull-shutdown/#TLDR

该解决方案效果很好,但是对于一个更大的项目,我想进一步构建代码。

我已按照以下要点重构了此代码。

https://gist.github.com/marcofranssen/699c1aa97c8a33ab20b5eccada275b08

由于某种原因,虽然优美的关机仍然像以前一样在go例程中运行,但似乎未执行srv.ListenAndServe()行。

对我来说,代码看起来相同,只是将其重构为单独的文件并添加了Start函数。

谁能解释我为什么在我发出Interrupt信号后才执行,导致http服务器立即启动和关闭?

最佳答案

我在社区的Gopher的帮助下找到了答案。

包含srv.ListenAndServe()的代码行是阻塞代码行,导致该代码行之后的日志不发生。

在我以前的博客中演示的原始代码中,我将此日志放在srv.ListenAndServe()的行前面。因此,在该示例中,相同的代码正按预期方式记录到控制台。

因此,毕竟这是一个愚蠢的错误,您可以轻松多次阅读。基本上交换了两行代码,我忘记了http.ListenAndServe()的阻塞行为。

KEY外卖店:

http.ListenAndServe()根据定义正在阻止,因此该行之后将不运行任何代码。

09-25 16:45