bson.M {} deepequal 似乎没有处理 int32
bson.M {} deepequal does not seem to hande int32
我有一个函数可以比较两个结构并制作一个 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 字段提供错误。
作为围棋初学者;我在这里错过了什么?我假设如果 bool/string 有效,那么 int32 也会有效。
这个:
bson.M{"starttime": 2}
将 "starttime"
键设置为文字 2
的值。 2
是一个无类型整数常量,由于没有提供类型,因此将使用其默认类型,即 int
.
只有当存储在接口值中的动态值具有相同的类型和值时,存储在接口值中的 2 个值才相等。因此 int
类型的值 2
不能等于 int32
.
类型的值 2
使用显式类型告诉你要指定一个值 int32
类型:
bson.M{"starttime": int32(2)}
我有一个函数可以比较两个结构并制作一个 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 字段提供错误。
作为围棋初学者;我在这里错过了什么?我假设如果 bool/string 有效,那么 int32 也会有效。
这个:
bson.M{"starttime": 2}
将 "starttime"
键设置为文字 2
的值。 2
是一个无类型整数常量,由于没有提供类型,因此将使用其默认类型,即 int
.
只有当存储在接口值中的动态值具有相同的类型和值时,存储在接口值中的 2 个值才相等。因此 int
类型的值 2
不能等于 int32
.
2
使用显式类型告诉你要指定一个值 int32
类型:
bson.M{"starttime": int32(2)}