到目前为止,我已经在两个包中构建了我的应用程序 - main
和 app
在我的 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/