我正在尝试使用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/

10-13 04:26