首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Viper映射环境变量到struct成员

Viper映射环境变量到struct成员
EN

Stack Overflow用户
提问于 2021-01-16 06:03:55
回答 1查看 5.6K关注 0票数 2

这是我的config.yaml文件

代码语言:javascript
运行
复制
server:
  port: 5000

这是我用毒蛇解封的逻辑

代码语言:javascript
运行
复制
type Configurations struct {
    Server ServerConfig
}

type ServerConfig struct {
    Port int
}

// LoadConfig reads configuration from file or environment variables.
func LoadConfig(path string) (config Configurations, err error) {
    viper.AddConfigPath(path)
    viper.SetConfigName("config")
    viper.SetConfigType("yaml")

    viper.AutomaticEnv()

    err = viper.ReadInConfig()
    if err != nil {
        return
    }

    err = viper.Unmarshal(&config)
    return
}

我已经设置了env变量export PORT=9000,现在我的问题是如何将环境变量PORT映射到Configurations.ServerConfig.Port。我希望配置文件中的dev默认值,并希望我的应用程序在生产中从env变量中读取/覆盖配置,如何使用viper实现这一点。

我看到以下选项

  1. 设置SERVER_PORT,然后使用下面这样的替换器将其解封为struct
代码语言:javascript
运行
复制
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
  1. Go viper .yaml值环境变量重写

但是,我想将变量PORT映射到struct成员,可能是因为我的宿主服务提供商设置了PORT env变量,而且我不能使用第二点,因为我希望使用yaml作为默认值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-16 06:40:07

可以使用viper.BindEnv(string...) error将特定的环境变量绑定到配置。

来自使用环境变量

BindEnv接受一个或多个参数。第一个参数是键名,其余参数是要绑定到此键的环境变量的名称。如果提供了多个,它们将按指定的顺序优先。

这里,端口的配置键是server.port,环境变量PORT应该绑定到它。

代码语言:javascript
运行
复制
...
viper.AutomaticEnv()


err = viper.BindEnv("server.port", "PORT")
if err != nil {
    return
}


err = viper.ReadInConfig()
...

有了这个更改,像PORT=9999 ./yourbinary这样的调用就会获取PORT并将其写入server.port中。从那里开始,它将被解压缩到您的结构中。

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

https://stackoverflow.com/questions/65746929

复制
相关文章

相似问题

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