为了账号安全,请及时绑定邮箱和手机立即绑定

使用 viper 从 envfile 读取配置

使用 viper 从 envfile 读取配置

Go
撒科打诨 2022-06-27 10:47:40
我真的不明白毒蛇是如何工作的。这是我的代码:配置.govar Config *Configurationtype ServerConfiguration struct {    Port string}type Configuration struct {    Server   ServerConfiguration}func Init() {    var configuration *Configuration    viper.SetConfigFile(".env")    viper.AutomaticEnv()    if err := viper.ReadInConfig(); err != nil {        log.Fatalf("Error reading config file, %s", err)    }    err := viper.Unmarshal(&configuration)    if err != nil {        log.Fatalf("Unable to decode into struct, %v", err)    }    Config = configuration}func GetConfig() *Configuration {    return Config}.env SERVER_PORT=:4747问题是 Unmarshal 不起作用当我使用例如 configuration.Server.Port 它是空的
查看完整描述

1 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

spf13/viper主要使用mapstructure包在一种本机 Go 类型之间转换为另一种,即在取消编组时。该包在内部使用map[string]interface{}type 来存储您的配置(请参阅viper.go - L1327)。之后,根据配置类型(您的情况是env),viper 调用正确的解析包来存储您的配置值。对于 envfile 类型,它使用subposito/gotenv放入上述映射类型(参见viper.go - L1501

您的问题的症结在于如何使 viper 在映射中将此配置解组为您选择的结构。这是 mapstructure 包进来的地方,将地图解组为您定义的嵌套结构。此时,您有两个选择

  1. 将配置解组为map[string]interface{}类型,然后使用 mapstructure 放入适当的结构

  2. 使用DecodeHookFunc作为方法的第二个参数来解组您的配置(参见viper.go - L904

为了简单起见,您可以做一个,根据我用您的示例复制的一个简单示例,可以在下面完成

package main


import (

    "fmt"

    "github.com/mitchellh/mapstructure"

    "github.com/spf13/viper"

)


type ServerConfiguration struct {

    Port string `mapstructure:"server_port"`

}


type Configuration struct {

    Server ServerConfiguration `mapstructure:",squash"`

}


func main() {

    var result map[string]interface{}

    var config Configuration

    viper.SetConfigFile(".env")

    if err := viper.ReadInConfig(); err != nil {

        fmt.Printf("Error reading config file, %s", err)

    }


    err := viper.Unmarshal(&result)

    if err != nil {

        fmt.Printf("Unable to decode into map, %v", err)

    }


    decErr := mapstructure.Decode(result, &config)


    if decErr != nil {

        fmt.Println("error decoding")

    }


    fmt.Printf("config:%+v\n", config)

}

您可以根据您的实际用例定制此工作示例。squash有关嵌入式结构的 mapstructure 标签的更多信息,请参见此处


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 291 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信