我以前曾写过关于在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()根据定义正在阻止,因此该行之后将不运行任何代码。