2 回答
TA贡献1818条经验 获得超11个赞
我认为您的问题是由于您使用了操作员db,Connect()范围被遮蔽了:=。如果你改变你的方法来声明一个dberrvar:
func Connect() {
var dberr error
db, dberr = sql.Open(“<CONNECTION_STRING>“)
if dberr != nil {
fmt.Println(dberr)
}
}
您的代码将按预期工作
TA贡献1829条经验 获得超9个赞
您超出范围是因为您正在通过db, err :=
赋值创建一个局部变量 db ,然后在 Connect func 返回时超出范围。
一般就使用sql.DB
从database/sql 包:
DB 是表示零个或多个底层连接池的数据库句柄。多个 goroutine 并发使用是安全的。
sql 包自动创建和释放连接;它还维护一个空闲连接的空闲池。
和
返回的数据库对于多个 goroutine 并发使用是安全的,并维护自己的空闲连接池。因此,应该只调用一次 Open 函数。很少需要关闭数据库。
也就是说,您想打开连接一次,然后在整个过程中保持打开状态。这样,当您完成(或遇到致命或恐慌)时实际关闭它的唯一可靠方法是defer db.Close()
在打开它后立即执行惯用的 go ,这需要在主函数中完成。
您仍然可以将 Connect 函数保留在您的包中,并使用它来初始化全局包变量 db,但从 main 调用一次并将 *sql.DB 返回到 main,以便您可以延迟 db.Close()。
- 2 回答
- 0 关注
- 236 浏览
添加回答
举报