【问题标题】:Why load environment variable main function golang为什么加载环境变量主函数golang
【发布时间】:2019-11-21 15:14:18
【问题描述】:

在制作 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()

}

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

谢谢

【问题讨论】:

  • 我会为此目的使用一个配置文件。您可以在其中添加初始化字符串并在程序的初始化阶段读取它们。
  • 为了提高可测试性,最好与main 中的调用上下文(命令行参数、环境变量等)进行交互,并将这些值传递给使用它们的函数。这样,测试可以根据需要调用具有测试值的相同函数。

标签: mysql go environment-variables


【解决方案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 {
   ...
}

【讨论】:

  • 谢谢!!我明白用 main 函数读取环境变量的重要性 但是另一方面,我不知道如何加载它。你能再给我一些例子吗?
  • 参考您的建议,我能够解决它。谢谢
猜你喜欢
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 2019-10-31
  • 2020-05-20
相关资源
最近更新 更多