首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用viper从envfile读取配置

使用viper从envfile读取配置
EN

Stack Overflow用户
提问于 2020-08-21 17:43:14
回答 1查看 3.3K关注 0票数 3

我真不明白毒蛇是怎么工作的。这是我的密码:

configuration.go

代码语言:javascript
运行
复制
var Config *Configuration

type 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

问题是,当我使用(例如,configuration.Server.Port )时,解组不能工作--它是空的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 21:10:00

spf13 13/viper主要使用地图结构包在一种本机Go类型之间转换为另一种类型,即在未封送处理时。包内部使用map[string]interface{}类型来存储配置(参见viper.go - L1327)。之后,根据配置类型(您的情况是env),viper调用正确的解析包来存储您的配置值。对于envfile类型,它使用次波西托/政府v输入上述映射类型(参见viper.go - L1501)。

问题的关键是如何使毒蛇在映射到您所选择的结构中对此配置进行解组。这就是mapstructure包出现的地方,用于将映射解压缩为您定义的嵌套结构。此时,您只剩下两个选项。

  1. 将配置解封为map[string]interface{}类型,然后使用映射结构放入适当的结构。
  2. 使用DecodeHookFunc作为方法的第二个参数来解除配置(参见viper.go - L904)

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

代码语言:javascript
运行
复制
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标记的更多信息,可以找到这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63527666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档