Go 包含需要清理的对象的包

Go 包含需要清理的对象的包,go,Go,我试图将我的数据库代码分组到一个子包中,该子包可以封装我的数据库连接和所有准备好的语句 我可以在包的init函数中创建数据库连接和语句,但我需要在某个时候关闭它们 在一个程序中,当这些变量在使用它们的代码中初始化时,我会使用defer db.Close(),等等,但是在这里怎么做呢 我不希望公开包的全局变量(连接和语句),以便调用方可以访问它们来关闭它们。有没有更优雅的方式 我怀疑我脑子里可能有一个错误的范例,我正试图用一种没有对象的语言创建对象(本质上就是这样)。如果是这样的话,我将感谢任何帮

我试图将我的数据库代码分组到一个子包中,该子包可以封装我的数据库连接和所有准备好的语句

我可以在包的
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'")
}

从您的示例代码中不太清楚您的问题是什么,但一般来说:

运行语句的函数需要完成语句并将其关闭(),或者需要向包中添加函数,以便调用方可以关闭它;就这么简单

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