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