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 配置文件问题的主要内容,如果未能解决你的问题,请参考以下文章

golang 配置文件解析神器--viper

Golang的viper库

golang模块viper读取配置文件

viper 源码分析

Viper的简单实用

Go 每日一库之 viper