何时在长期运行的GO程序中发布资源



我正在使用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中填充这样的结构并调用其方法。对于测试,您可以填充结构,以进行任何要进行的测试的方法,然后在测试结束时拆除连接。

最新更新