2

我使用 viper 编写了一个简单的 go 程序来读取配置文件。

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 字段?

4

1 回答 1

0

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"))
  
}
于 2021-12-23T05:06:32.827 回答