我正在尝试将一些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代码的工作?
最受欢迎的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在他的评论中指出的那样,现在由您的应用程序来动态处理架构。我觉得这可能符合“读取模式”的要求,因此与使用静态数据定义的方法相比,该方法有很多折衷方案:
我想问一下您是否真的有动态数据?