Mysql 为什么加载环境变量主函数golang

Mysql 为什么加载环境变量主函数golang,mysql,go,environment-variables,Mysql,Go,Environment Variables,在申请Golang时 关于Mysql的读取方法,最好使用main函数读取环境变量并将其传递给参数 环境变量的原因是一种全局变量情况,在这种情况下,当在测试期间从模块外部查看时,您不知道为什么DB包连接到名为XXX的主机。我收到一份解释,怀疑可能会写入一个固定值 这是当前代码 mysql.go func Init() *gorm.DB { path := strings.Join([]string{os.Getenv("MYSQL_USER"), ":", os.Getenv("MYSQ

在申请Golang时

关于Mysql的读取方法,最好使用main函数读取环境变量并将其传递给参数

环境变量的原因是一种全局变量情况,在这种情况下,当在测试期间从模块外部查看时,您不知道为什么DB包连接到名为XXX的主机。我收到一份解释,怀疑可能会写入一个固定值

这是当前代码

mysql.go

func Init() *gorm.DB {
    path := strings.Join([]string{os.Getenv("MYSQL_USER"), ":", os.Getenv("MYSQL_PASSWORD"), "@tcp(", os.Getenv("DB_HOST"), ":", os.Getenv("DB_PORT"), ")/", os.Getenv("MYSQL_DATABASE"), "?charset=utf8&parseTime=True&loc=Local"}, "")

    db, err := gorm.Open("mysql", path)
    if err != nil {
        panic(err)
    }

    err = db.DB().Ping()
    if err != nil {
        panic(err)
    }

    DB = db

    return DB
}

如果你能告诉我你是否知道最好的方法,我会很高兴的


谢谢

理想情况下,您将拥有一个单独的结构来保存所有配置值。然后,您可以拥有从各种源(环境变量、文件等)填充配置结构的函数

此外,您可以使用
fmt.Sprintf
来改进路径构建

下面是一个大概的例子,它可能看起来如何

func Init()*gorm.DB{
cfg:=LoadConfigFromEnvironment()
路径:=fmt.Sprintf(“%s:%s@tcp(%s:%d)/%s?字符集=utf8&parseTime=True&loc=Local”,
cfg.DBUser,
cfg.DBPassword,
cfg.DBHost,
cfg.DBPort,
cfg.DBName,
)
db,err:=gorm.Open(“mysql”,path)
如果错误!=零{
恐慌(错误)
}
err=db.db().Ping()
如果错误!=零{
恐慌(错误)
}
返回数据库
}
请注意我是如何删除
DB=DB
分配的。不确定这是怎么回事,但您不应该从该函数中为全局变量赋值

正如其他人提到的,理想情况下,您应该将配置加载与初始化分开,因此
Init
的定义最好如下所示

func Init(cfg Config)*gorm.DB{
...
}

为此,我将使用配置文件。您可以在那里添加初始化字符串,并在程序的初始化阶段读取它们。为了提高可测试性,最好与
main
中的调用上下文(命令行参数、环境变量等)交互,并将这些值传递给使用它们的函数。这样测试就可以根据需要调用具有测试值的相同函数。谢谢!!我理解使用main函数读取环境变量的重要性,但另一方面,我不知道如何加载它。你能再给我举几个例子吗?我根据你的建议解决了这个问题。非常感谢。
main.go

func main {

    db := mysql.Init()
    defer db.Close()

}