Go 从文件中的yaml对象获取值

Go 从文件中的yaml对象获取值,go,yaml,Go,Yaml,我有时间学习围棋,但我在处理yaml文件时遇到了问题 这是我的yaml文件 --- endpoints: service1: url: "https://service1.com" frequency: 2 interval: 1 service2: url: "https://service2.com" frequency: 3 interval: 2 我的密码 package main

我有时间学习围棋,但我在处理yaml文件时遇到了问题

这是我的yaml文件

--- 
endpoints: 
  service1: 
    url: "https://service1.com"
    frequency: 2
    interval: 1
  service2: 
    url: "https://service2.com"
    frequency: 3
    interval: 2 
我的密码

package main

import (
    "fmt"
    "io/ioutil"
    "reflect"

    "gopkg.in/yaml.v3"
)

// Config define estrutura do arquivo de configuração
type 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 informados
func PingEndpoint(url string, frequency, interval int) {
    // do something

}

有没有更好的方法来定义配置结构而不使用接口?是否真的需要使用reflect来获取
service1的属性,或者存在更好的方法来实现这一点?

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

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解组到映射[interface{}]接口{}):

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