如何构建重复的结构

问题描述 投票:1回答:1

我有一个程序,它将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
}

怎么克服这个?

go struct
1个回答
1
投票

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))
}
© www.soinside.com 2019 - 2024. All rights reserved.