golang DeepEqual和reflect.Zero

时间:2017-02-28 14:54:02

标签: go reflection

我正在尝试检查结构中的字段是否设置为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

谢谢!

2 个答案:

答案 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以相同的方式打印它们,但这并不意味着它们是相同的类型。

查看此游乐场:https://play.golang.org/p/mLcLSV_0vA