Viper,无法获取函数外部初始化的值

问题描述 投票:0回答:2

我在使用 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)
    }    
go
2个回答
0
投票

我怀疑按照您所示进行包变量初始化将导致 viper 配置在执行

GetString()
之前不完整,因此返回的是零(空)字符串值。如果没有看到如何初始化 viper 配置,我猜测它不在
init()
函数中,而是在
main()
函数中,在分配包变量时尚未运行。

您可能应该在需要它的最高级别函数中检索

viper.GetString("db.host")
,而不是在包初始化期间。


0
投票

从你的代码中答案非常明显。

“project/Model”被导入到你的Main.go中,这意味着Model.go将在main函数实际运行之前首先加载。

在加载Model.go期间,它不必viper,因为此时viper实例将为nil。因此,您没有获得

viper.GetString("db.host")
的值。

© www.soinside.com 2019 - 2024. All rights reserved.