【问题标题】:Construct deep struct is not working构造深层结构不起作用
【发布时间】:2017-12-21 14:07:42
【问题描述】:

我有负责从 yaml 文件中解析数据的结构体 虽然这个结构有时会工作,但我会得到一些需要解析的新字段

这是有效的

  - name: test1
    type: type
    path: path

这不是

 - name: test1
    type: type
    path: path
    build-parameters:
       maven-opts:
          defines:
              skipTests: true

这是结构

type Modules struct {
    Name string
    Type string
    Path string
    Parameters Parameters `yaml:"build-parameters,omitempty"`
}

参数类型为:

type Parameters map[string]string

我应该如何构造我的结构来接受这个构建参数条目?

这是我使用的库

https://github.com/go-yaml/yaml

【问题讨论】:

    标签: dictionary go struct hashmap yaml


    【解决方案1】:

    您的结构与数据结构不匹配。如果Parametersmap[string]string,它接受键和值都是string 的键值对。在您的数据中,build-parameters 包含一个对象,该对象包含一个对象,该对象包含一个键值对。

    您可以将Parameters 重新定义为map[string]interface{} 并使用类型断言,或者您可以定义整个结构,例如:

    type Parameters struct {
        MavenOpts struct {
            Defines map[string]string
        } `yaml:"maven-opts"`
    }
    

    如果您使用空接口,则必须使用类型断言,这会变得非常麻烦。例如:

    if opts, ok := module.Parameters["maven-opts"].(map[string]interface{}); ok {
        if defines,ok := opts["defines"].(map[string]interface{}); ok {
            if skipTests,ok := defines["skipTests"].(bool); ok {
                // skipTests is the bool value from the yaml
            }
        }
    }
    

    【讨论】:

    • 非常感谢,1+能否请您也提供例如使用接口 (map[string]interface{}) 以及我应该如何从中获取数据作为答案,现在它的 maven 选择和构建参数,但它可以是具有这种结构的任何值....MavenOpts 在你的例子中是硬编码的,它可以是任何值...
    • 类型断言有据可查 in the tourin the spec
    • 我在这里最大的缺乏知识,如果我使用map[string]interface{},我应该如何访问以找到值,例如对于skipTests ...
    • 谢谢,但这里它的结构很深......有点不同,有点复杂
    • 完全不同。您在每个嵌套级别执行文档中完全相同的类型断言。
    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2014-06-19
    相关资源
    最近更新 更多