cmp.Equal 给出紧急消息“无法处理 .. 处的未导出字段”

问题描述 投票:0回答:1

我有一个自定义结构,其中有一个未导出的字段。我希望能够将值与该结构的类型进行比较,但我收到了这样的恐慌消息:

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)

如何修复此错误并比较变量?

go struct comparison go-cmp
1个回答
10
投票

正如错误消息所示,我们可以使用

cmp.AllowUnexported
函数。这里重要的一点是我们应该提供的参数是包含未导出字段的类型,而不是未导出字段本身的类型。

所以最后一行应该改为这样:

result := cmp.Equal(t1, t2, cmp.AllowUnexported(Mytype{}))

另请注意,

cmp.AllowUnexported
不适用于子类型递归。如果您的子类型包含未导出的字段,则必须显式传递它们。

© www.soinside.com 2019 - 2024. All rights reserved.