包含需要清理的对象

时间:2014-07-06 05:10:11

标签: go

我正在尝试将我的数据库代码分组到一个子包中,这将封装我的数据库连接和所有准备好的语句。

我可以在包的init函数中创建数据库连接和语句,但我需要在某些时候关闭它们。

在一个程序中,这些变量在使用它们的代码中初始化,我会使用defer db.Close()等,但是如何在这里解决这个问题?

我不希望公开包的全局变量(连接和语句),以便调用者可以访问它们来关闭它们。有没有办法以更优雅的方式做到这一点?

我怀疑我可能有一个错误的范例,我试图用一种没有它们的语言来创建对象(这基本上就是它在这里)。如果是这样,那么我将非常感谢有关如何做到这一点的任何帮助。

package database

import (
  "database/sql"
  _ "github.com/lib/pq"
)

var db *sql.DB
var stmtSelectUser *sql.Stmt

func GetUser(email string) string {
  var name string
  stmtSelectUser.QueryRow(email).Scan(&name)
  return name
}

func init() {
  var e error;
  db, e = sql.Open("postgres", "host=localhost dbname=pictocat sslmode=disable")
  stmtSelectUser, e = db.Prepare("select * from users where email='$1'")
}

1 个答案:

答案 0 :(得分:0)

从您的示例代码中可以清楚地知道您的问题是什么,但一般来说:

运行语句的函数需要完成语句而Close()它或者你需要在你的包中添加一个函数,以便调用者可以关闭它;就这么简单。

您不需要公开包中的所有数据库内容,只需要一个反过来调用Close()的函数。