我有一个程序,它将yamls文件解析为一个对象(结构)。我使用以下repo来做到这一点
https://github.com/go-yaml/yaml
例如在我的文件中:
dependency :
- name: ui
type: runner
cwd: /ui
install:
- name: api
group: test
我使用以下结构
type Dependency struct {
Name string
Type string
CWD string
Install []Install
//here I have the issue
Requires ?
}
type Install struct {
Name string
Group string
}
现在我有两个问题,有点复杂的结构。
这是可以在Dependency
结构中的条目,这是它在yaml文件中的样子
requires:
- name: db
- type: mongo
但它也可以
requires:
- name: db
- name: rst
- name: test
- name: test2
由于它有多个名称属性,我应该如何构建此结构
另外我在yaml的领域
_type-version: "1.0.0"
当我把它放在结构中,如下所示我得到错误,因为我使用-
type TypeVer struct{
_Type-version string
}
怎么克服这个?
yaml包实际上允许您重新映射属性的名称,您可以使用它来处理您的_type-version
属性。而你最初的问题是:只需将Requires
定义为与Install
相同:
package main
import (
"fmt"
"log"
"github.com/go-yaml/yaml"
)
type File struct {
TypeVersion string `yaml:"_type-version"`
Dependency []Dependency
}
type Dependency struct {
Name string
Type string
CWD string
Install []Install
Requires []Requires
}
type Install struct {
Name string
Group string
}
type Requires struct {
Name string
Type string
}
var data = `
_type-version: "1.0.0"
dependency:
- name: ui
type: runner
cwd: /ui
install:
- name: api
group: test
requires:
- name: db
- type: mongo
- name: rst
- name: test
- name: test2
`
func main() {
f := File{}
err := yaml.Unmarshal([]byte(data), &f)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- t:\n%v\n\n", f)
d, err := yaml.Marshal(&f)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- t dump:\n%s\n\n", string(d))
}