为了账号安全,请及时绑定邮箱和手机立即绑定

从文件中的 yaml 对象获取值

从文件中的 yaml 对象获取值

Go
长风秋雁 2022-06-27 16:45:04
我有时间学习 Go,但在处理 yaml 文件时遇到了问题。这是我的 yaml 文件--- endpoints:   service1:     url: "https://service1.com"    frequency: 2    interval: 1  service2:     url: "https://service2.com"    frequency: 3    interval: 2 我的代码package mainimport (    "fmt"    "io/ioutil"    "reflect"    "gopkg.in/yaml.v3")// Config define estrutura do arquivo de configuraçãotype Config struct {    Endpoint map[string]interface{} `yaml:"endpoints"`}func main() {    yamlFile, err := ioutil.ReadFile("config.yml")    if err != nil {        fmt.Printf("Error reading YAML file: %s\n", err)        return    }    var yamlConfig Config    err = yaml.Unmarshal(yamlFile, &yamlConfig)    if err != nil {        fmt.Printf("Error parsing YAML file: %s\n", err)    }    for k := range yamlConfig.Endpoint {        nm := reflect.ValueOf(yamlConfig.Endpoint[k])        for _, key := range nm.MapKeys() {            strct := nm.MapIndex(key)            fmt.Println(key.Interface(), strct.Interface())        }    }}// PingEndpoint acessa os endpoint informadosfunc PingEndpoint(url string, frequency, interval int) {    // do something}有没有更好的方法来定义配置结构而不使用接口?真的有必要使用反射来获取 a 的属性service1还是存在更好的乳清来做到这一点?
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

通常,interface{}如果您不知道结构,则在这种情况下使用 an。在这种情况下,结构似乎是固定的:


type Service struct {

   URL string `yaml:"url"`

   Frequency int `yaml:"frequency"`

   Interval int `yaml:"interval"`

}


type Config struct {

    Endpoint map[string]Service `yaml:"endpoints"`

}

对于您的第二个问题,执行此操作后您不再需要处理未知字段,但即使您有接口{},您也可以使用类型断言(类型 yaml 库将 yaml 解组为 map[interface{}]interface{} ):


for k := range yamlConfig.Endpoint {

     if mp, ok:=yamlConfig.Endpoint[k].(map[interface{}]interface{}); ok {

         for key, value:=range mp {

        }

    }

}


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信