我正在使用Go and Socket.io构建聊天服务器,因此服务器将无限期地运行。在程序启动时需要分配多个资源,例如数据库连接,redis连接等。
现在我想知道何时应释放所有这些连接(关闭)?我可以在defer
函数中使用main
吗?当main
到达终点时,它会关闭它们吗?或者我应该打开它,因为程序不会自动退出?
答案 0 :(得分:1)
我倾向于做的一件事是:
func main() {
if err := run(); err != nil {
log.Fatal(err)
}
}
func run() error {
// Do stuff here
}
在run
中,您可以按照惯例defer
进行操作。但是,在像服务器这样长期运行的程序中,IMO可以退出:操作系统将自动清理进程占用的所有资源,无论你连接的数据库或后端是什么,都必须是能够处理意外死亡的过程无论如何。这被称为"仅崩溃的软件"。
对于测试,您应该以不依赖于全局状态的方式构建代码 - 例如有一个结构,其中包含数据库连接的字段等。使业务逻辑成为该结构(或采用它的函数)的方法。然后,您可以在main
填充此类结构并调用其方法。对于测试,您可以填充结构,为您想要执行的任何测试调用其方法,然后在测试结束时拆除连接。