为了测试,我经常看到代码读取字节切片,使用yaml将其解析为结构,例如:
https://github.com/kubernetes/kubernetes/blob/master/pkg/util/strategicpatch/patch_test.go#L74m
我只是因为没有导出我的字段名而被咬了,导致我在我的测试用例中迭代了一个空列表,因此假设所有测试都通过了(事后看来,应该是一个红旗:))。还有其他错误被yaml unmarshaling默默忽略,例如一个键拼写错误并且没有完全匹配结构字段。
有没有办法确保字节切片中的所有数据实际都被解析为yaml.Unmarshal返回的结构?如果没有,其他人如何处理这种情况?
答案 0 :(得分:0)
对于搜索此问题的解决方案的任何人,yaml.v2库都有一个UnmarshalStrict方法,如果yaml文档中的键中没有相应字段,则该方法会返回错误。
import yaml "gopkg.in/yaml.v2"
err := yaml.UnmarshalStrict(data, destinationStruct)
这不是问题的一部分,但我只是想记录如何在toml中实现类似的东西:
您可以找到toml文件中是否有任何键无法使用toml.decode函数返回的元数据进行解码。
import "github.com/BurntSushi/toml"
metadata, err := toml.Decode(data, destinationStruct)
undecodedKeys := metadata.Undecoded()
请注意,metadata.Undecoded()还会返回由于Primitive值而未解码的键。你可以read more about it here。
默认的go json库目前不支持此功能,但有一个proposal ready to be merged。似乎它将成为1.10的一部分。