去YAML解析: mandatory fields

标签 go

总结: 我需要将 YAML 格式的数据解析为 golang 结构。是否有一种方法(库、属性)使某些字段成为必需字段,即如果某些字段不存在,则使 Unmarshal 函数返回错误?

例如想要什么: 此代码中的 Unmarshal 函数应该引发错误,因为输入数据不包含“b”字段。

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
)

type TestStruct struct {
    FieldA string `yaml:"a"`
    FieldB string `yaml:"b"`
}

func main() {
    input := []byte(`{a: 1}`)
    var output TestStruct

    _ = yaml.Unmarshal(input, &output)
}

最佳答案

您可以使用这个 libraryHasZero 方法检查结构中是否存在任何缺失值。这将返回 true 或 false,具体取决于结构是否已完全填充。请看 Playground example得到一个想法。

但如果您特别需要告知缺少哪个字段,则需要检查该值是否为 nil,如下例所示。

package main
import (
   "fmt"
   "errors"
  "gopkg.in/yaml.v2"
)

type TestStruct struct {
  FieldA  string `yaml:"a"`
  FieldB  string `yaml:"b"`
}

func main() {
  input := []byte(`{a: 1}`)

  var output TestStruct 
  if err := output.ParseFromFile(input); err != nil {
     fmt.Println(err)
  }
  fmt.Println(output)     
}

func (output *TestStruct) ParseFromFile(data []byte) error {

  if err := yaml.Unmarshal(data, output); err != nil {
    return err
  }

  if output.FieldA == "" {
    return errors.New("Blank Field A")
  }
  if output.FieldB == "" {
    return errors.New("Blank Field B")
  }

  return nil
}

Playground example如果你需要专门返回一个错误

关于去YAML解析: mandatory fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56506045/

相关文章:

http - Golang 如何使用 keepalive 处理优雅关机

mongodb - go mongo 驱动程序更新无法将对象数组设置为 null

go - go 对象组件可以以复合模式相互通信吗?

GO:使用 html/template 提供模板时出错

unit-testing - 如何在 Golang 的单元测试中测试 net.Conn?

go - 如何确定变量是 slice 还是数组?

java - 将剪辑路径信息添加到图像

winapi - 在 Windows Go 中使用 DLL

go - 从另一个本地包导入本地包

xml - 如何正确解析xml