Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将yaml文件解析为go中的预定义结构_Go_Struct_Yaml - Fatal编程技术网

将yaml文件解析为go中的预定义结构

将yaml文件解析为go中的预定义结构,go,struct,yaml,Go,Struct,Yaml,我有多个需要解析的yaml文件,它们的结构完全相同 schema: "1.0.0" id: test version: "1.2.3" dependency : - name: ui type: runner cwd: /ui install: - name: api group: test properties: name: app url: appUrl

我有多个需要解析的yaml文件,它们的结构完全相同

schema: "1.0.0"
id: test
version: "1.2.3"


dependency :
  - name: ui
    type: runner
    cwd: /ui
    install:
       - name: api
         group: test
         properties:
             name: app
             url: appUrl

  - name: backend
    type: mongoDb
    path: be
    install:
       - name: db
         type: mongo
    provides:
       - name: api
         properties:
            url: url
架构部分对于应用程序应该使用的所有yaml都是必需的 总是

依赖项标记可以包含1..n个带有必填字段的条目 ,名称,类型,cwd

依赖项标记可以(或不可以)包含带有
名称的
安装
部分 和
属性
,这是必需的

依赖项标记可以(或不可以)包含
提供
节和
名称
这是强制性的

安装可以有属性,提供的也可以有属性 性质

我正在使用a解析文件,但我的问题是如何在Golang中构建结构,当我解析文档时,它将自动填充主结构并包含子结构(例如依赖项/安装部分)

我试过类似的东西

type main struct {
    schema struct {
        schema  string
        id int
        version string
    }

    dependency struct {
        name  string
        type string
        cwd string

    install struct {
        name  string
    }


}
在install部分,它可以是group或type,也可以是group或type,也可以是properties部分,所以我不确定如何构建 我用来解析文档的一些通用/可扩展结构(文档有一系列属性,我在示例中介绍了大多数选项)

我使用这个库来解析文档


您的结构定义应该是这样的

type Yaml struct {
    Schema     string
    ID         string
    Version    string
    Dependency []Dependency
}

type Dependency struct {
    Name     string
    Type     string
    CWD      string
    Install  []Install
    Provides []Provide
}

type Install struct {
    Name       string
    Group      string
    Type       string
    Properties Properties
}

type Properties struct {
    Name string
    URL  string
}

type Provide struct {
    Name       string
    Properties Properties
}
以下是完整的示例代码:

package main

import (
    "fmt"
    "io/ioutil"
    "log"

    "gopkg.in/yaml.v2"
)

var data = `
schema: "1.0.0"
id: test
version: "1.2.3"


dependency :
  - name: ui
    type: runner
    cwd: /ui
    install:
       - name: api
         group: test
         properties:
             name: app
             url: appUrl

  - name: backend
    type: mongoDb
    path: be
    install:
       - name: db
         type: mongo
    provides:
       - name: api
         properties:
             url: url
`

type Yaml struct {
    Schema     string
    ID         string
    Version    string
    Dependency []Dependency
}

type Dependency struct {
    Name     string
    Type     string
    CWD      string
    Install  []Install
    Provides []Provide
}

type Install struct {
    Name       string
    Group      string
    Type       string
    Properties Properties
}

type Properties struct {
    Name string
    URL  string
}

type Provide struct {
    Name       string
    Properties Properties
}

func main() {
    y := Yaml{}

    err := yaml.Unmarshal([]byte(data), &y)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("%+v\n", y)

}
输出

{Schema:1.0.0 ID:test Version:1.2.3 Dependency:[{Name:ui Type:runner CWD:/ui Install:[{Name:api Group:test Type: Properties:{Name:appURL:appUrl}}] Provides:[]} {Name:backend Type:mongoDb CWD: Install:[{Name:db Group: Type:mongo Properties:{Name: URL:}}] Provides:[{Name:api Properties:{Name: URL:url}}]}]}
如果要读取yaml文件,只需在主功能中替换:

err := yaml.Unmarshal([]byte(data), &y)


您的结构定义应该是这样的

type Yaml struct {
    Schema     string
    ID         string
    Version    string
    Dependency []Dependency
}

type Dependency struct {
    Name     string
    Type     string
    CWD      string
    Install  []Install
    Provides []Provide
}

type Install struct {
    Name       string
    Group      string
    Type       string
    Properties Properties
}

type Properties struct {
    Name string
    URL  string
}

type Provide struct {
    Name       string
    Properties Properties
}
以下是完整的示例代码:

package main

import (
    "fmt"
    "io/ioutil"
    "log"

    "gopkg.in/yaml.v2"
)

var data = `
schema: "1.0.0"
id: test
version: "1.2.3"


dependency :
  - name: ui
    type: runner
    cwd: /ui
    install:
       - name: api
         group: test
         properties:
             name: app
             url: appUrl

  - name: backend
    type: mongoDb
    path: be
    install:
       - name: db
         type: mongo
    provides:
       - name: api
         properties:
             url: url
`

type Yaml struct {
    Schema     string
    ID         string
    Version    string
    Dependency []Dependency
}

type Dependency struct {
    Name     string
    Type     string
    CWD      string
    Install  []Install
    Provides []Provide
}

type Install struct {
    Name       string
    Group      string
    Type       string
    Properties Properties
}

type Properties struct {
    Name string
    URL  string
}

type Provide struct {
    Name       string
    Properties Properties
}

func main() {
    y := Yaml{}

    err := yaml.Unmarshal([]byte(data), &y)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("%+v\n", y)

}
输出

{Schema:1.0.0 ID:test Version:1.2.3 Dependency:[{Name:ui Type:runner CWD:/ui Install:[{Name:api Group:test Type: Properties:{Name:appURL:appUrl}}] Provides:[]} {Name:backend Type:mongoDb CWD: Install:[{Name:db Group: Type:mongo Properties:{Name: URL:}}] Provides:[{Name:api Properties:{Name: URL:url}}]}]}
如果要读取yaml文件,只需在主功能中替换:

err := yaml.Unmarshal([]byte(data), &y)


谢谢1+,你能提供一个例子,你会如何解析这个结构的答案中的文件吗?非常感谢,我已经尝试了你的例子,它部分工作。
安装
属性
提供的
对象是空的,知道吗?很抱歉,这没问题是vs代码调试器,它似乎没有在deep struct中显示对象…查看我的更新,您无法打开数组对象查看其中的内容我的最后一个问题:)如果您需要构建这个golang程序,您将如何构造项目,让我们假设main位于
rootProj->cmd>main下。转到
您将所有的“struct”放在哪里(项目中的哪个文件夹,如果为每个结构创建新文件…)以及如何将它们加载到主方法中。非常感谢!如果应用程序仅限于此问题描述,您可以将其保存在一个文件中。应用程序的最终设计应取决于您的全部要求和复杂性。这感觉像是另一个问题,而且过于笼统。请将其与另一个StackOverflow问题分开d提供更多细节。感谢1+,您能提供示例如何解析此结构的答案中的文件吗?非常感谢,我尝试了您的示例,它部分工作。
安装
属性
提供
对象为空,有什么想法吗?很抱歉,这没问题,问题是vs code debugg呃,它似乎没有在deep struct中显示对象…请看我的更新,您无法打开数组对象查看其中的内容我的最后一个问题:)如果您需要构建这个golang程序,您将如何构造项目,让我们假设main位于
rootProj->cmd>main下。go
您将所有的“struct”放在哪里(项目中的哪个文件夹,如果为每个结构创建新文件…)以及如何将它们加载到主方法中。非常感谢!如果应用程序仅限于此问题描述,您可以将其保存在一个文件中。应用程序的最终设计应取决于您的全部要求和复杂性。这感觉像是另一个问题,而且过于笼统。请将其与另一个StackOverflow问题分开d提供更多细节。