我有一个自定义结构,其中有一个未导出的字段。我希望能够将值与该结构的类型进行比较,但我收到了这样的恐慌消息:
panic: cannot handle unexported field at ...
consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported
示例代码:
type MyType struct {
ExpField int
unexpField string
}
t1 := MyType{ExpField: 1}
t2 := MyType{ExpField: 2}
result := cmp.Equal(t1, t2)
如何修复此错误并比较变量?
正如错误消息所示,我们可以使用
cmp.AllowUnexported
函数。这里重要的一点是我们应该提供的参数是包含未导出字段的类型,而不是未导出字段本身的类型。
所以最后一行应该改为这样:
result := cmp.Equal(t1, t2, cmp.AllowUnexported(Mytype{}))
另请注意,
cmp.AllowUnexported
不适用于子类型递归。如果您的子类型包含未导出的字段,则必须显式传递它们。