Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Golang中创建一个全局变量是否可能,是否有良好的实践?_Go - Fatal编程技术网

在Golang中创建一个全局变量是否可能,是否有良好的实践?

在Golang中创建一个全局变量是否可能,是否有良好的实践?,go,Go,因此,我正在创建一个CLI应用程序,一些命令需要访问数据库。 现在他们都有了这样的代码: db, err := gorm.Open(sqlite.Open(fmt.Sprintf("%s/db/db.sqlite", dir)), &gorm.Config{}) if err != nil { panic("failed to connect database") } 哪种方

因此,我正在创建一个CLI应用程序,一些命令需要访问数据库。 现在他们都有了这样的代码:

        db, err := gorm.Open(sqlite.Open(fmt.Sprintf("%s/db/db.sqlite", dir)), &gorm.Config{})
        if err != nil {
            panic("failed to connect database")
        }
哪种方法违反了干燥原则(不要重复)


有什么方法可以避免这种情况吗?

我想这大概就是@Flimzy在谈论依赖注入时的想法(如果我错了,请告诉我!)

命令
结构中有一个指向数据库的指针。结构上的任何方法都可以访问此打开的数据库

type命令结构{
db*gorm.db
}
//示例命令
func(c命令)FindByUUID()(m[]MyModel,err error){
//这些命令现在可以访问数据库
c、 db.Find(&m,“tag=?”,“foobar”)
返回m,c.db.Error
}
或将其作为显式参数传递:

func FindByUUID(db*gorm.db)(m[]MyModel,err error){
db.Find(&m,“tag=?”,“foobar”)
返回m,db.Error
}

Go中没有全局名称空间,但您可以通过从任何包(除了
main
)导出全局可访问的变量来创建这些变量。所以从这个意义上说,这当然是可能的。这是不是一个好主意是一个意见的问题。一个流行的观点是尽可能避免全球性的。但这是目前为止对这件事的唯一看法。另一种针对您的具体情况的常用方法是依赖注入。通常,在应用程序生命周期开始时,您只需连接一次数据库,然后将打开的连接传递到应用程序的其他部分。这是否意味着我必须传递大量变量?如数据库连接、记录器、API客户端、配置等?或者,如果我将所有这些都绑定到某个结构上,这是一个好主意吗?@Flimzy您可以将您的评论发布为答案吗?我会将它们标记为这个问题的答案。您可以传递许多变量。或者,您可以创建包含它们的对象。