go - 包含需要清理的对象的包

标签 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'")
}

最佳答案

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

要么运行语句的函数需要完成语句并对其进行 Close(),要么您需要向包中添加一个函数以便调用者可以关闭它;就这么简单。

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

关于go - 包含需要清理的对象的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24592898/

相关文章:

python - 戈朗 : swagger REST api documents generator

go - 发出 `go install`时出错

c++ - golang select 语句是如何实现的?

go - 将* grpcpool.ClientConn转换为* grpc.ClientConn的方法

go - 所有的协程都在 sleep

go - golang 中十六进制的大数字

go - 使用 GORM golang 持久化自定义集数据类型

mongodb - 如何使用 golang 和 mongodb 过滤日期?

exception - 戈朗 : Defensive interfaces for nil types

go - byte内置类型,不应该是uint8吗?