在Go中加载动态Yaml结构

Jer*_*pel 6 yaml dynamic go

我正在尝试将一些Python代码转换为Golang,并且在弄清楚如何加载动态Yaml数据时遇到了一些困难,我认为这是非常基本的。到目前为止,我发现的所有方法都提到了创建Struct和映射值,但这是不可能的,因为每次读取时,我将接收的数据都会有所不同。

这不是真实数据(实际上会从API返回),但以yaml文件为例:

[ ~]$ cat /tmp/example.yaml
Massachusetts:
  cities:
    - name: 'Boston'
      area_code: 617
    - name: 'Springfield'
    - name: 'Worcester'
Virginia:
  cities:
    - name: 'Richmond'
    - name: 'Arlington'
      landmarks:
        - 'The Pentagon'
        - 'National Airport'
        - 'Arlington National Cemetary'
  presidents:
    - 'George Washington'
    - 'Thomas Jefferson'
    - 'James Madison'
    - 'James Monroe'
    - 'William Henry Harrison'
    - 'John Tyler'
Missouri:
  rivers:
    - 'Missouri River'
    - 'Mississippi'
    - 'Arkansas River'
    - 'White River'
Run Code Online (Sandbox Code Playgroud)

在Python中阅读和操作它很简单:

#!/usr/bin/python
import yaml
with open('/tmp/example.yaml', 'r') as fh:
    data = yaml.load(fh)

print yaml.dump(data, default_flow_style=False)
Run Code Online (Sandbox Code Playgroud)

当我刚接触Go时,有谁知道我应该使用哪种技术/应该寻找的文档可以完成此Python代码的工作?

dm0*_*514 5

最受欢迎的go yaml软件包之一在其文档中提供了以下确切示例:

package main

import (
        "fmt"
        "log"

        "gopkg.in/yaml.v2"
)

var data = `
a: Easy!
b:
  c: 2
  d: [3, 4]
`

func main() {
     m := make(map[interface{}]interface{})

     err := yaml.Unmarshal([]byte(data), &m)
     if err != nil {
         log.Fatalf("error: %v", err)
     }
     fmt.Printf("--- m:\n%v\n\n", m)
}
Run Code Online (Sandbox Code Playgroud)

正如Flimzy在他的评论中指出的那样,现在由您的应用程序来动态处理架构。我觉得这可能符合“读取模式”的要求,因此与使用静态数据定义的方法相比,该方法有很多折衷方案:

  • 解组后,必须在运行时处理类型断言/检查
  • 模式必须用逻辑和断言编码,而不是声明
  • ??

我想问一下您是否真的有动态数据?

  • 我希望他们将它们分成不同的示例(“解编介绍性结构”,“解编入地图”等),因为我完全错过了将解组到地图中,这可能正是我针对特定不幸的情况所需要的。 (2认同)