go - 将 yaml 解析为具有动态字段的结构

标签 go struct

我使用以下代码来解析 yaml 来构造哪个工作正常。 现在假设我有一个像 install 这样的结构,我知道它有两个 const properties,例如 NameGroup 但是此外,我们还可以有额外的关键值属性,这些属性可能会发生变化,您可以获得任何关键值属性(动态)

我应该如何定义这个结构?这个想法是读取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:
       - 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/

相关文章:

c - 为什么代码会泄漏内存?

go - os.Mkdir 与 syscall.Mkdir,在 Golang 中有什么区别?

go - 网络/网址包 : strip query from url

sql - gorm 是否用逻辑 OR 解释结构体的内容?

objective-c - 为什么 Objective C 对象的 isa 字段与其类指针有 1 个偏移量?

c# - 在 Struct 中存储引用类型

ssh - 戈朗 : Execute shell commands on remote server

arrays - 如何设置字节数组的位

c - scanf 加载 struct -> char[] 的问题

c - 如何将结构指针变量作为参数传递以便在 C 中对其进行编辑