3 回答
TA贡献1798条经验 获得超3个赞
您可以使用时替换映射器,并考虑默认值,如下所示:ExpandEnvExpand
package main
import (
"fmt"
"os"
"strings"
)
func main() {
mapper := func(placeholderName string) string {
split := strings.Split(placeholderName, ":")
defValue := ""
if len(split) == 2 {
placeholderName = split[0]
defValue = split[1]
}
val, ok := os.LookupEnv(placeholderName)
if !ok {
return defValue
}
return val
}
os.Setenv("DAY_PART", "morning")
fmt.Println(os.Expand("Good ${DAY_PART:test}, ${NAME:Gopher}", mapper))
}
这将呈现
Good morning, Gopher
这是基于操作系统包文档中的扩展中的示例。
TA贡献1911条经验 获得超7个赞
我建议你使用spf13)的真棒Viper软件包来读取conf文件,它可以优雅地解决你的问题,你可以用它来加载许多其他类型的配置文件。
解决您的问题
获取软件包
go get github.com/spf13/viper
配置文件
假设你有名为的配置文件:db.yaml
db: name: somedb host: localhost
代码示例
正如我们所看到的,一旦Viper加载了conf文件,我们就可以通过键获取值。Yaml文件将被解析为嵌套结构,您可以将其解封为Golang结构,我们应该使用它来获取值,您可以参考此页面以获取更多用法信息。viper.GetString("db.name")
import (
"fmt"
"github.com/spf13/viper"
)
func InitConf() {
viper.AutomaticEnv() // read system env
viper.SetConfigName("db") // conf file name to be load
viper.AddConfigPath(".") // conf file path
viper.SetDefault("db.name", "mysqldb") // you can set default da name value here
// do read conf file and handle error
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// Config file not found; ignore error if desired
} else {
// Config file was found but another error was produced
}
}
fmt.Printf("db.name: %s", viper.GetString("db.name"))
}
viper.AutomaticEnv()
此方法将自动读取系统 env,假设您有一个名为 env 的 env,然后您可以通过以下方式获取它。如果 env 名称与配置文件密钥的名称相同,则 viper 首先使用 envENV_XXX
viper.GetString("ENV_XXX")
当我们不设置输出时,输出将是
name
db.yaml
db.name: mysqldb
当我们设置值时:在 db.yaml 中,输出将是
name
somedb
db.name: somedb
希望你会发现它有用!有关用法的更多详细信息,请参阅蝰蛇自述文件
TA贡献1872条经验 获得超3个赞
我猜你有一个这样的会议结构:
Db *struct{ Name string Host string }
因此,要检索Dbname的默认变量,您必须像这样检查它:
if conf.Db == nil || conf.Db.Name == "" { conf.Db.Name = "test" }
- 3 回答
- 0 关注
- 347 浏览
添加回答
举报