gpt4 book ai didi

go - 从 yaml 文件中以自定义格式读取配置

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:57 29 4
gpt4 key购买 nike

我有一个 YAML 格式的配置文件。我正在尝试以某种自定义格式读取配置。我猜不出我可以使用的任何模式,比如树、json 等。例如。应用程序.yaml

organization:
products:
product1:
manager: "Rob"
engineer: "John"
product2:
manager: "Henry"
lead: "patrick"

配置文件可能包含大量信息,并且因文件而异。我想按以下格式构造数据,

organization/products/product1/manager  =  Rob
organization/products/product1/engineer = John
organization/products/product2/lead = patrick

{"organization/products/product1/manager":"Rob","organization/products/product2/lead":"patrick"}

知道如何实现这种模式吗?

最佳答案

这本质上是一个打印树的练习。确切的实现将取决于您选择的特定 YAML 解析器,但几乎所有解析器都将具有某种“任何映射”类型。在非常流行的 gopkg.in/yaml.v2 中,这种类型被命名为 MapSlice (不要让这个名字让您感到困惑;它泄露了必须处理灵活键类型的实现)。

只需将它扔到您最喜欢的树遍历算法中即可呈现文本文件。这是一个仅适用于字符串键和一些标量叶节点的简单示例:

package main

import (
"bytes"
"fmt"
"io"
"log"
"path/filepath"
)

func main() {
var tree yaml.MapSlice
if err := yaml.Unmarshal(input, &tree); err != nil {
log.Fatal(err)
}

var buf bytes.Buffer
if err := render(&buf, tree, ""); err != nil {
log.Fatal(err)
}
}

func render(w io.Writer, tree yaml.MapSlice, prefix string) error {
for _, branch := range tree {
key, ok := branch.Key.(string)
if !ok {
return fmt.Errorf("unsupported key type: %T", branch.Key)
}

prefix := filepath.Join(prefix, key)

switch x := branch.Value.(type) {
default:
return fmt.Errorf("unsupported value type: %T", branch.Value)

case yaml.MapSlice:
// recurse
if err := render(w, x, prefix); err != nil {
return err
}
continue

// scalar values
case string:
case int:
case float64:
// ...
}

// print scalar
if _, err := fmt.Fprintf(w, "%s = %v\n", prefix, branch.Value); err != nil {
return err
}
}

return nil
}

关于go - 从 yaml 文件中以自定义格式读取配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49936530/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com