全局变量和Go
我目前正在尝试一个小型围棋项目,我有一个问题我正在努力解决 我目前正在使用全局变量和Go,go,graphql,graphql-go,Go,Graphql,Graphql Go,我目前正在尝试一个小型围棋项目,我有一个问题我正在努力解决 我目前正在使用github.com/jinchu/gorm来处理GraphQL服务器后端的数据库操作,并且我希望能够将DB连接存储在整个项目(包括子包)中可访问的全局变量中 我的第一次尝试是通过在我的main.go文件中执行以下操作来创建名为db的变量: var db *gorm.DB var err error 然后在init()函数中: func init() { db, err = gorm.Open("postgres
github.com/jinchu/gorm
来处理GraphQL服务器后端的数据库操作,并且我希望能够将DB连接存储在整个项目(包括子包)中可访问的全局变量中
我的第一次尝试是通过在我的main.go
文件中执行以下操作来创建名为db
的变量:
var db *gorm.DB
var err error
然后在init()函数中:
func init() {
db, err = gorm.Open("postgres", "credential stuff here")
db.AutoMigrate(&modelStructHere)
defer db.Close()
}
没有任何崩溃,但我假设由于作用域的原因,db
变量只能在main.go
中使用,但我还需要能够在gql/gql.go
中使用它,我的GraphQL解析器当前所在的位置
也许我应该将这段代码(DB init)移动到实际的解析器文件中,因为在这样的事情之外,DB操作实际上没有任何用处,所以这可能就是问题所在
提前谢谢 亚历克斯的评论恰到好处。创建一个名为“database”的文件夹,并在其中放入一个名为“database.go”的文件,其中包含以下内容:
package database
// the imports go here
var DB *gorm.DB
现在,您可以通过database.DB
在任何地方使用它。您不应该将错误变量设为全局变量,而是在初始化DB的同一个函数中处理它。init函数可以位于任何位置,通常您希望它位于主函数中程序的开头。将其移动到另一个包中,并使其大写var DB*gorm.DB
。然后你可以在任何地方导入它。您现在这样做的问题是,gql.go
无法从main导入,因为这将是一个依赖循环。将其移动到另一个非主包将删除该循环。