Go 从文件中的yaml对象获取值
我有时间学习围棋,但我在处理yaml文件时遇到了问题 这是我的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
---
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 {
}
}
}