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

时间:2019-11-21 15:14:18

标签: 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("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
}

main.go

func main {

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

}

如果您能告诉我您是否知道这样做的最佳方法,我会很高兴。

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

这是一个大概的样子。

func Init() *gorm.DB {
    cfg := LoadConfigFromEnvironment()
    path := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
        cfg.DBUser,
        cfg.DBPassword,
        cfg.DBHost,
        cfg.DBPort,
        cfg.DBName,
    )

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

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

    return db
}

注意,以及我如何删除DB = db分配。不知道这是怎么回事,但是您不应该从该函数分配一个全局变量。

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

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