我有一个函数,用于比较两个结构,并制作一个bson文档作为mongodb updateOne()的输入。
结构格式示例
type event struct {
...
Name string
StartTime int32
...
}
Diff函数,请忽略我还没有检查出没有差异。
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字段却给出了一个错误。
作为一个围棋初学者,我到底遗漏了什么?我认为如果boolstring可以工作,那么int32也可以。
This:
bson.M{"starttime": 2}
设置 "starttime"
键的字面值 2
. 2
是一个无类型的整数常量,由于没有提供类型,所以将使用其默认类型,即 int
.
而存储在接口值中的2个值,只有当存储在它们中的动态值的类型和值相同时,才是相等的。所以一个值 2
与 int
类型不能等于一个值 2
类型 int32
.
使用显式类型来告诉你要指定的值为 int32
种类:
bson.M{"starttime": int32(2)}