go - 如何在 Go 中将 DB 连接初始化作为一个包分开?
问题描述
我有两个包,main
和db
. 但是,我得到"DB declared and not used"
错误。
db.go
package db
import (
"database/sql"
)
var DB *sql.DB
func Connect() {
DB, err := sql.Open("mysql", "root:xxxx@/xxxx")
if err != nil {
panic(err.Error())
}
}
func Close() {
DB.Close()
}
main.go
package main
import (
"database/sql"
// "fmt"
_ "github.com/go-sql-driver/mysql"
"html/template"
"net/http"
"github.com/****/****/config"
"github.com/****/****/db"
)
var tpl *template.Template
func init() {
tpl = template.Must(template.ParseGlob("templates/*.gohtml"))
}
func main() {
Connect()
defer Close()
loadRoutes()
http.ListenAndServe(":8080", nil)
}
解决方案
Golang 对变量声明非常严格, Golang 常见问题解答中也提到了这一点:
未使用的变量的存在可能表明存在错误,而未使用的导入只会减慢编译速度,随着时间的推移,随着程序积累代码和程序员,这种影响会变得很重要。由于这些原因,Go 拒绝使用未使用的变量或导入来编译程序,以短期的便利性换取长期的构建速度和程序的清晰度。
不过,解决这种情况很容易。在开发过程中,使用空白标识符让未使用的东西保持不变。
_, err := sql.Open("mysql", "root:Berlin2018@/jplatform")
但是由于您希望通过创建连接来建立数据库实例。我建议通过从函数返回来使用它,或者您可以通过将 ping 发送到数据库服务器来检查连接是否正常:
var DB *sql.DB
func Connect() {
DB, err := sql.Open("mysql", "root:Berlin2018@/jplatform")
if err = DB.Ping(); err != nil {
log.Panic(err)
}
}
或者您可以创建一个结构,您可以在任何您想要的地方使用它,包括为每个需要 db 连接来查询数据库的函数使用方法接收器
type Env struct {
db *sql.DB
}
func Connect() {
db, err := sql.Open("mysql", "root:Berlin2018@/jplatform")
_ = &Env{db: db}
}
func(env *Env) getDataFromDatabase(){}
推荐阅读
- arraylist - 为什么我的 arraylist 大小在适配器页面上等于 0?
- git - 通过詹金斯错误向 github 进行身份验证
- regex - 跟踪 Ruby 正则表达式中的分隔符更改
- c# - 带有 EmguCV 的 CUDA 中的 SEHException
- python - Flask - 服务器端的定期检查
- cas - CAS 6.2.x MFA 主体属性触发器“memberOf”Active Directory 不工作
- java - 给定一个字符串列表,是否可以在一行中获得从每个长度到具有该长度的字符串集的映射,按长度排序?
- typescript - 通过 Visual Studio Code 调试 Electron 应用程序
- javascript - 我的卡被覆盖了。请你告诉我如何以行格式排列
- java - JavaFX 布局未更新和电子邮件发送优化问题