何时在长期运行的Go程序中释放资源?

时间:2018-02-20 08:27:57

标签: go resources

我正在使用Go and Socket.io构建聊天服务器,因此服务器将无限期地运行。在程序启动时需要分配多个资源,例如数据库连接,redis连接等。

现在我想知道何时应释放所有这些连接(关闭)?我可以在defer函数中使用main吗?当main到达终点时,它会关闭它们吗?或者我应该打开它,因为程序不会自动退出?

1 个答案:

答案 0 :(得分:1)

我倾向于做的一件事是:

func main() {
    if err := run(); err != nil {
        log.Fatal(err)
    }
}

func run() error {
    // Do stuff here
}

run中,您可以按照惯例defer进行操作。但是,在像服务器这样长期运行的程序中,IMO可以退出:操作系统将自动清理进程占用的所有资源,无论你连接的数据库或后端是什么,都必须是能够处理意外死亡的过程无论如何。这被称为"仅崩溃的软件"。

对于测试,您应该以不依赖于全局状态的方式构建代码 - 例如有一个结构,其中包含数据库连接的字段等。使业务逻辑成为该结构(或采用它的函数)的方法。然后,您可以在main填充此类结构并调用其方法。对于测试,您可以填充结构,为您想要执行的任何测试调用其方法,然后在测试结束时拆除连接。

相关问题