总结: 我需要将 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)
}
最佳答案
您可以使用这个 library的 HasZero
方法检查结构中是否存在任何缺失值。这将返回 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/