gpt4 book ai didi

go - 解析 yaml 以使用动态字段进行结构化

转载 作者:IT王子 更新时间:2023-10-29 02:10:41 31 4
gpt4 key购买 nike

我使用以下代码将 yaml 解析为可以正常工作的结构。现在让我们假设我有一个像 install 这样的结构,我知道它有两个 const properties,比如 NameGroup 但是此外我们可以有额外的key val properties可以改变,你可以获得任何key val properties(动态)

我应该如何定义这个结构?这个想法是读取 yaml 文件修改一些值并将其写回(具有修改后的值的完全相同的结构)到FS因此我不想错过一些动态字段,这些字段可能在一些需要修改的 yaml 文件中

主要包

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

namegroup 之后还有更多字段

最佳答案

使用 Map 而不是 Install 结构将有助于解决问题。

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))
}

关于go - 解析 yaml 以使用动态字段进行结构化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47906837/

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