我正在尝试检查结构中的字段是否设置为reflect.DeepEqual
的零值。我的想法是,如果是这种情况,我可以使用默认的值更改其值,如下所示:
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
。
谢谢!
答案 0 :(得分:3)
下面:
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上尝试。
答案 1 :(得分:1)
问题与您使用反射包有关。
field.Interface()
返回一个int(包含在interface{}
中),而
reflect.Zero(field.Type())
返回一个reflect.Value类型的对象。 fmt.Println以相同的方式打印它们,但这并不意味着它们是相同的类型。