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

时间:2015-08-27 20:53:59

标签: go

在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中进行单元测试问题,但这里可能没问题)?

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

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

其他一些选择?

2 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。首先,在这个范围内打开了连接,你可能想把它推迟到这里。

db, err := sql.Open("postgres", "user=root dbname=root")
        if err != nil {
        log.Fatal(err)
    }
defer db.Close()

当您离开此范围时,这将确保清除连接。关于你的处理程序......将它们作为闭包写在与连接相同的范围内是很简单的,这样你就可以自由地使用它。

编辑:澄清一下,你说你不认为你可以在main中嵌套函数。你可以用类似的东西来做到这一点

get_handler := func() {
      return db.ReadTheData()
}
http.HandleFunc("get", get_handler)

答案 1 :(得分:0)

大多数应用程序通常会在全局范围内使用数据库处理程序。 sql.DB被定义为对并发访问是安全的,因此所有需要它的处理程序可以同时使用它。

var db *sql.DB

func main() {
    var err error
    db, err = sql.Open("postgres", "user=root dbname=root")
    if err != nil {
        log.Fatal(err)
    }
...