比较2个结构时,go cmp将空接口值视为int和flat64

比较2个结构时,go cmp将空接口值视为int和flat64,go,reflection,Go,Reflection,所以我使用的是go-cmpgithub.com/google/go-cmp/cmp。比较两个结构。 两个结构的类型相同。当比较结果时,我看到以下差异 我正在使用GoV1.12 type Sample struct{ Field1 map[string]interface } var a Sample var b Sample cmp.Diff(a,b) // Somewhere in code I do this a.Field1["sample"] = 1 // this is o

所以我使用的是go-cmp
github.com/google/go-cmp/cmp
。比较两个结构。 两个结构的类型相同。当比较结果时,我看到以下差异

我正在使用GoV1.12

type Sample struct{
   Field1 map[string]interface
}
var a Sample
var b Sample

cmp.Diff(a,b)


// Somewhere in code I do this
a.Field1["sample"] = 1 // this is optional.
因此,如果我比较a和b,我会看到差异,它将同一字段解释为int(0)和float64(0)


我预计差异为零

因为结构是从json中分离出来的,json将所有数字视为浮点数

供参考,Go中有
结构
映射
,它们不是一回事。所以你不是在比较两个结构而是两个映射。@mkopriva对此很抱歉,但在我的例子中,映射[string]接口是一个结构的一部分,我想让它更简单。你是如何填充
a
b
?你在做
a[“样本”]=1
b[“样本”]=1
?或者其中一个是从json中解封的?我这样问是因为,如果目标类型是
interface{}
,则通过
encoding/json
pacakge将json数字(即使它代表一个整数)解组为
float64
。@mkopriva可能就是这样。有什么方法可以测试这个吗?因此,我将这个值从一个服务发送到另一个服务,方法是将它编组到json中,并记录该行为;请参阅“要将JSON解组为接口值,解组将其中一个存储在接口值中:…”
-: int(0)
+: float64(0)