3 回答
TA贡献1858条经验 获得超8个赞
问题是您使用了Short 变量声明, :=并且您只是将创建的*DB值存储在局部变量中而不是全局变量中。
这一行:
db, err := NewDB(dbinfo)
创建 2 个局部变量:dband err,这个局部变量db与你的全局db变量无关。您的全局变量将保持为nil。您必须将 created 分配给*DB全局变量。不要使用简短的变量声明,而是使用简单的赋值,例如:
var err error
db, err = NewDB(dbinfo)
if err != nil {
log.Fatal(err)
}
原答案如下。
它是一种指针类型,在使用之前必须对其进行初始化。指针类型的零值是nil。
您不必导出它(这就是以大写字母开头的内容)。请注意,您拥有多个文件并不重要,只要它们属于同一个包的一部分,它们就可以访问彼此定义的标识符。
一个好的解决方案是在init()自动调用的包函数中执行此操作。
请注意,sql.Open()可能只验证其参数而不创建与数据库的连接。要验证数据源名称是否有效,请调用DB.Ping()。
例如:
var db *sql.DB
func init() {
var err error
db, err = sql.Open("yourdrivername", "somesource")
if err != nil {
log.Fatal(err)
}
if err = db.Ping(); err != nil {
log.Fatal(err)
}
}
TA贡献1875条经验 获得超3个赞
icza 已经正确回答了您的具体问题,但值得添加一些关于您做错了什么的额外解释,以便您了解如何在将来不犯错误。在 Go 中,:=赋值语法创建了名称位于 左侧的新变量:=,可能是隐藏包,甚至是父作用域函数/方法变量。举个例子:
package main
import "fmt"
var foo string = "global"
func main() {
fmt.Println(foo) // prints "global"
// using := creates a new function scope variable
// named foo that shadows the package scope foo
foo := "function scope"
fmt.Println(foo) // prints "function scope"
printGlobalFoo() // prints "global"
if true {
foo := "nested scope"
fmt.Println(foo) // prints "nested scope"
printGlobalFoo() // prints "global"
}
// the foo created inside the if goes out of scope when
// the code block is exited
fmt.Println(foo) // prints "function scope"
printGlobalFoo() // prints "global"
if true {
foo = "nested scope" // note just = not :=
}
fmt.Println(foo) // prints "nested scope"
printGlobalFoo() // prints "global"
setGlobalFoo()
printGlobalFoo() // prints "new value"
}
func printGlobalFoo() {
fmt.Println(foo)
}
func setGlobalFoo() {
foo = "new value" // note just = not :=
}
注意 Go 无法删除或取消设置变量,因此一旦您隐藏了更高范围的变量(例如通过创建与包范围变量同名的函数范围变量),就无法访问更高范围的变量该代码块中的变量。
另请注意,这:=是var foo =. 两者的行为方式完全相同,但是:=仅在函数或方法中var才是有效的语法,而该语法在任何地方都有效。
TA贡献2016条经验 获得超9个赞
对于谁来到这里并想要快速回答。
在db.go文件中:
package db
var db *DB
type DB struct {
*gorm.DB // or what database you want like *mongo.Client
}
func GetDB() *DB {
if db == nil{
db = ConnectToYourDbFunc("connection_string")
}
return db
}
然后在您的其他软件包中,您可以通过以下方式获得它:
db := db.GetDB()
就这样。
- 3 回答
- 0 关注
- 176 浏览
添加回答
举报