- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的不明白 viper 是如何工作的。这是我的代码:
配置.go
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
}
.envSERVER_PORT=:4747
问题是 Unmarshal 不起作用例如,当我使用 configuration.Server.Port 时,它是空的
最佳答案
spf13/viper主要使用 mapstructure包在一种 native Go 类型之间转换为另一种,即在取消编码时。该包在内部使用 map[string]interface{}
类型来存储您的配置(请参阅 viper.go - L1327 )。之后根据配置类型(你的情况是 env
),viper 调用正确的解析包来存储你的配置值。对于 envfile 类型,它使用 subosito/gotenv放入上述 map 类型(参见 viper.go - L1501 )
问题的症结在于如何让 viper 在映射中将此配置解码为您选择的结构。这是 mapstructure 包的用武之地,用于将 map 解码为您定义的嵌套结构。此时你有两个选择
map[string]interface{}
类型,然后使用 mapstructure 放入适当的结构为了简单起见,你可以做一个,根据我用你的例子复制的一个简单的例子,可以在下面完成
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)
}
您可以根据您的实际用例自定义此工作示例。有关嵌入式结构的 mapstructure squash
标签的更多信息,请参见 here
关于go - 使用 viper 从 envfile 中读取配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63527666/
我真的不明白 viper 是如何工作的。这是我的代码: 配置.go var Config *Configuration type ServerConfiguration struct { Po
我对 react 原生中的生产/开发构建感到非常困惑。我可以通过使用终端中的包脚本让我的应用程序在 iOS 和 Android 上运行 ENVFILE='/path/to/.env' react-na
我是一名优秀的程序员,十分优秀!