golang viper & hcl 配置文件问题
Posted
技术标签:
【中文标题】golang viper & hcl 配置文件问题【英文标题】:golang viper & hcl config file issues 【发布时间】:2020-12-21 02:47:43 【问题描述】:我编写了一个简单的 go 程序,使用 viper 读取配置文件。
package main
import (
"fmt"
"log"
"github.com/spf13/viper"
)
func main()
viper.SetConfigType("hcl")
// # first used file
viper.AddConfigPath(".")
viper.SetConfigName("example.hcl")
err := viper.ReadInConfig()
if err != nil
log.Fatal(err)
fmt.Println("host.address =", viper.GetString("host.address"))
fmt.Println("host.port =", viper.GetString("host.port"))
viper.Reset()
带有 ./example.hcl 的
"host" =
"address" = "localhost"
"port" = "5799"
程序的输出是
host.address =
host.port =
如果我将配置文件的名称切换为 .yaml(并相应地调整代码)并使用
"host":
"address": "localhost",
"port": 5799
代码有效。有人对我做错了什么有建议吗?还是 viper 不适用于嵌入式 hcl 字段?
【问题讨论】:
【参考方案1】:Viper 和 HCL 不能很好地集成和发挥作用,就像你之前的例子一样
您可以使用koanf 作为解决上述问题的替代方法
看这个例子。
package main
import (
"fmt"
"github.com/knadh/koanf"
"github.com/knadh/koanf/parsers/hcl"
"github.com/knadh/koanf/providers/file"
)
var Conf = koanf.New(".")
func main()
Conf.Load(file.Provider("/etc/app/config.hcl"),hcl.Parser(true))
fmt.Println("host.address =", Conf.Get("host.address"))
fmt.Println("host.port =", Conf.Get("host.port"))
【讨论】:
以上是关于golang viper & hcl 配置文件问题的主要内容,如果未能解决你的问题,请参考以下文章