2017-10-04 75 views
-1

我有一个使用毒蛇的问题,我已经通过viper方法分配了变量,所以当我尝试在任何函数中获取值时,我有一个空值。有没有人知道为什么会这样?任何其他变量初始化工作正常,但不是viper GetString方法。Vi蛇,无法获得在函数外初始化的值

结构: 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) 
    }  
+0

由于viper.GetString返回字符串(不是指针),它不会为空。你的意思是返回值是*空字符串*?首先,通过'viper.IsSet'检查密钥是否存在。 – putu

+0

对不起,是的,字符串是空的。 Key存在,因为当我在func里面使用getString时,它给了我一个我需要的值。 –

+1

这意味着viper.GetString在viper配置被初始化之前被调用,例如,通过'viper.ReadConfig'等。使用['init()'](https://stackoverflow.com/questions/24790175/when-is-the-init-function-run)函数。 – putu

回答

0

我怀疑,这样做包变量初始化为您展示将导致不被执行GetString()前完成毒蛇配置,因此返回的是零(空)字符串值。没有看到你如何初始化你的viper配置,我猜测它不是在init()函数中,而是在main()函数中,该函数在分配包变量时尚未运行。

您应该在需要它的最高级别函数内部而不是在程序包初始化期间检索viper.GetString("db.host")

+0

well viper初始化在main()函数中你猜对了(对不起,我错过了它),但变量init在另一个包中 –

+0

是的,请参阅https://golang.org/ref/spec#Package_initialization和https://golang.org/doc/effective_go.html#initialization。可能其他软件包正在初始化毒蛇,因为这个变量被赋值为 –

+0

,我修改了一下我的问题,我不明白为什么函数里面的方法返回正确的值,但外部调用是空的。如果它将重新初始化,它不会给我一个配置值。 –