Golang 访问共享连接资源的最佳实践?

在 golang(RabbitMQ、数据库等)中处理与外部服务的共享连接资源的处理范围的最佳实践是什么?例如,给定这段代码使用 database/sql、pq 和 http:


func main() {

    db, err := sql.Open("postgres", "user=root dbname=root")

        if err != nil {

        log.Fatal(err)

    }


    http.HandleFunc("/", front_handler)

    http.HandleFunc("/get", get_handler)

    http.HandleFunc("/set", set_handler)

    http.ListenAndServe(":8080", nil)

}

使db对象可供我注册的处理程序使用的最佳方法是什么?


我是否将db声明放在主要范围之外(这会导致我在 Python 中出现单元测试问题,但在这里可能没问题)?


我是否将处理程序声明放在主范围内(似乎不允许我嵌套函数)?


是否有我可以用来访问主范围的寻址方案(我会在 puppet 中做类似的事情)?


还有其他选择吗?


肥皂起泡泡
浏览 143回答 2
2回答

陪伴而非守候

有很多方法可以解决这个问题。首先,在此范围内打开连接后,您可能希望将其推迟到此处关闭。db, err := sql.Open("postgres", "user=root dbname=root")        if err != nil {        log.Fatal(err)    }defer db.Close()这将确保在您离开此范围时清除连接。关于您的处理程序......将它们编写为与连接相同范围内的闭包很简单,因此您可以自由使用它。编辑:澄清一下,你说你认为你不能在 main.js 中嵌套函数。你可以用类似的东西来做到这一点;get_handler := func() {      return db.ReadTheData()}http.HandleFunc("get", get_handler)

慕桂英4014372

大多数应用程序从全局范围内的数据库处理程序开始是很常见的。sql.DB被定义为对并发访问是安全的,因此可以被所有需要它的处理程序同时使用。var db *sql.DBfunc main() {    var err error    db, err = sql.Open("postgres", "user=root dbname=root")    if err != nil {        log.Fatal(err)    }...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go