我使用以下代码将yaml解析为struct,这可以正常工作。
现在让我们假设我有一个类似install
的结构,我知道它有两个const properties
,如Name
和Group
,但另外我们可以有额外的key val properties
可以改变,你可以得到任何关键的val属性(动态)
我该如何定义这个结构?我的想法是读取yaml文件修改一些值并将其写回(具有完全相同的结构和修改后的值)到 FS ,因此 I不想错过一些动态字段,这些字段可能位于需要修改的某个yaml文件中
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
//Here any key value can be
}
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))
}
实施例
Install
可以像上面一样,也可以像这样
install:
- name: api
group: test
a1:test2
b1:test2
还
install:
- name: api
group: test
z10:123
zzz:111
name
和group
答案 0 :(得分:1)
映射而不是安装结构将有助于解决问题。
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 map[string]string
func (i Install) name() string {
return i["name"]
}
func (i Install) group() string {
return i["group"]
}
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))
}