我正在尝试使用reflect.DeepEqual
检查结构中的字段是否设置为零值。想法是,如果是这种情况,我可以使用默认值(如struct标签)更改其值,如下所示:
type struct {
A int `default:"42"`
}
我的问题如下:好像
reflect.DeepEqual
总是返回false
。我想我缺少了一些东西。这是我要执行的操作的一个简单示例:package main
import (
"fmt"
"reflect"
)
func main() {
s := struct{ A int }{0}
field := reflect.ValueOf(s).Field(0)
fmt.Println(field.Interface())
fmt.Println(reflect.Zero(field.Type()))
fmt.Println(reflect.DeepEqual(field.Interface(), reflect.Zero(field.Type())))
}
这是上面代码的围棋版:https://play.golang.org/p/k9VY-2Dc69
我想知道为什么在这种情况下
DeepEqual
返回false
。谢谢!
最佳答案
这里:
reflect.DeepEqual(field.Interface(), reflect.Zero(field.Type()))
您正在将
int
值(包装在interface{}
中)与 reflect.Value
类型的值进行比较。 reflect.Zero()
返回reflect.Value
类型的值,而不是interface{}
类型的值。您忘记在第二个参数上调用
Value.Interface()
:reflect.DeepEqual(field.Interface(), reflect.Zero(field.Type()).Interface())
这将打印
true
。在Go Playground上尝试一下。关于go - golang DeepEqual和reflect.Zero,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42511940/