go - 如何为包含 DB conn 之类的应用程序包设置全局配置?

标签 go

到目前为止,我已经在两个包中构建了我的应用程序 - mainapp

在我的 main() 中,我启动我的服务器:

func main() {
    router := app.CreateRouter(app.Routes())
    log.Fatal(http.ListenAndServe(":8080", router))
}

在应用程序中,我有一个 Config 结构,它有一个方法 connectToDB:

type Config struct {
    DB *sql.DB
}

func (c *Config) connectToDB() {
    connectionString := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable", os.Getenv("DB_USERNAME"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_NAME"))
    var err error
    c.DB, err = sql.Open("postgres", connectionString)
    if err != nil {
        log.Fatal(err)
    }
}

func init() {
    c := Config{}
    c.connectToDB()
}

但是,我有各种处理程序,如果我想使用 Config.DB,我该怎么做?

例如,在app.UserIndex中,如何获取Config.DB

func UserIndex(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    fmt.Fprint(w, "test!\n")
}

现在,我能做的一件事就是设置一个全局变量,例如

var c 配置

然后,我可以在包 app 中的任何位置访问 c.DB。然而,这感觉很糟糕..

最佳答案

你可以制作一个App变量来保存配置和一些其他有用的设置,例如Http超时

var (
      App struct {
           DB         *sql.DB
           Timeout time.Duration
           ...
      }
)

然后在这个结构上制作方法。这样配置就会被封装在应用实例中。

关于go - 如何为包含 DB conn 之类的应用程序包设置全局配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47117990/

相关文章:

go - 如何使用 Golang 在文件中写入整数?

go - 内置库来持久化 BTree,相当于 Java 的 `FileChannel` 和 `ByteBuffer`

Golang channel 输出顺序

go - 端点 Google ID JWT 和 Golang oauth2 : have id_token, 需要 access_token?

for-loop - for 循环中的 goroutines 问题

go - Go 的内存占用是多少

go build 有效但 go test 没有

go - 使用反射从深度嵌套的结构中提取标签

windows - 如何使用Go创建的exe创建Windows服务?

将字符串转到 ascii 字节数组