go - Go YAML 解析:必填字段
问题描述
总结:我需要将YAML格式的数据解析成golang struct。是否有办法(库、属性)使某些字段成为强制性字段,即如果某些字段不存在,则使 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
方法来检查结构中是否有任何缺失值。这将返回真或假,具体取决于结构是否完全填充。请参阅操场示例以获得一个想法。
但是,如果您特别需要说明缺少哪个字段,则需要检查该值是否为 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示例
推荐阅读
- python - 如何创建一个充当 Python 脚本 GUI 的网站
- android - Xamarin Android LinearLayout - 一页上有 2 个 RecyclerViews 的问题
- sql - 历史表上的 SQL 语句
- javascript - 在 React 中传递 refs
- apache-spark - pyspark 数据帧中的顺序操作
- xml - XML 发布者中的列总和
- verilog - Verilog中位选择的差异
- keycloak - Kubernetes Keycloak 高可用集群
- websocket - 使用 cognito 授权放大 PubSub javascript 订阅和发布:如何?
- axon - 基于轴突状态的聚合是否有指定@CreatedDate 和@LastModifiedDate 的方法?