我有一个函数用于比较两个结构并将 bson 文档作为输入到 mongodb updateOne()
示例结构格式
type event struct {
...
Name string
StartTime int32
...
}
差异功能,请忽略我还没有检查没有差异。
func diffEvent(e event, u event) (bson.M, error) {
newValues := bson.M{}
if e.Name != u.Name {
newValues["name"] = u.Name
}
if e.StartTime != u.StartTime {
newValues["starttime"] = u.StartTime
}
...
return bson.M{"$set": newValues}, nil
}
然后我生成了一个测试函数,如下所示:
func Test_diffEvent(t *testing.T) {
type args struct {
e event
u event
}
tests := []struct {
name string
args args
want bson.M
wantErr bool
}{
{
name: "update startime",
args: args{
e: event{StartTime: 1},
u: event{StartTime: 2},
},
want: bson.M{"$set": bson.M{"starttime": 2}},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := diffEvent(tt.args.e, tt.args.u)
if (err != nil) != tt.wantErr {
t.Errorf("diffEvent() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("diffEvent() = %v, want %v", got, tt.want)
}
})
}
}
这失败了
--- FAIL: Test_diffEvent/update_startime (0.00s)
models_test.go:582: diffEvent() = map[$set:map[starttime:2]], want map[$set:map[starttime:2]]
对我来说,这似乎是一样的。我玩过这个,bool 字段、字符串字段、枚举字段和结构字段或结构数组字段似乎与 deepequal 一起工作得很好,但它给出了 int32 字段的错误。
作为初学者;我在这里想念什么?我假设如果 bool/string 有效,那么 int32 也可以。
最佳答案
这:
bson.M{"starttime": 2}
设置
"starttime"
文字值的键 2
. 2
是一个无类型整数常量,由于没有提供类型,所以将使用它的默认类型,即 int
.只有存储在接口(interface)值中的动态值具有相同的类型和值时,存储在接口(interface)值中的 2 个值才相等。所以一个值
2
与 int
类型不能等于值 2
类型 int32
.使用显式类型告诉您要指定
int32
的值类型:bson.M{"starttime": int32(2)}
关于mongodb - bson.M {} deepequal 似乎无法处理 int32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62258509/