2017-10-04 61 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

,我修改了一下我的問題,我不明白爲什麼函數裏面的方法返回正確的值,但外部調用是空的。如果它將重新初始化,它不會給我一個配置值。 –