首页 > 解决方案 > 如何在 Go 中将 DB 连接初始化作为一个包分开?

问题描述

我有两个包,maindb. 但是,我得到"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)
}

标签: gopackage

解决方案


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(){}

推荐阅读