我在使用 viper 时遇到问题,我已经通过 viper 方法分配了变量,因此当我尝试在任何函数内获取值时,我有一个空值。有人知道为什么会这样吗?任何其他变量初始化都可以正常工作,但 viper GetString 方法不行。
结构: main.go
package main
import (
"project/Model"
"github.com/spf13/viper"
...
)
func main() {
//Config handling
viper.SetConfigName("main")
viper.AddConfigPath("/config/")
err = viper.ReadInConfig()
...
}
封装型号
package Model
import ("github.com/spf13/viper"
...
)
var sqlhost = viper.GetString("db.host")
func foo() {
log.Println(sqlhost)
}
我怀疑按照您所示进行包变量初始化将导致 viper 配置在执行
GetString()
之前不完整,因此返回的是零(空)字符串值。如果没有看到如何初始化 viper 配置,我猜测它不在 init()
函数中,而是在 main()
函数中,在分配包变量时尚未运行。
您可能应该在需要它的最高级别函数中检索
viper.GetString("db.host")
,而不是在包初始化期间。
从你的代码中答案非常明显。
“project/Model”被导入到你的Main.go中,这意味着Model.go将在main函数实际运行之前首先加载。
在加载Model.go期间,它不必viper,因为此时viper实例将为nil。因此,您没有获得
viper.GetString("db.host")
的值。