golang DeepEqual 和 Reflect.Zero

标签 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())))
}

这是上面代码的 go Playground 版本: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 .

关于golang DeepEqual 和 Reflect.Zero,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42511940/

相关文章:

json - 将 JSON 解析为结构

c# - 获取方法中的参数名称(并用作字典键?)

java - 反射和多维数组

C# 反射,将 MakeGenericMethod 与具有 'new()' 类型约束的方法一起使用

c# - ParameterInfo.ParameterType 是 "SqlBytes&",如何与 typeof() 比较

python - 尝试从 python 脚本执行 golang 程序时出错

ruby-on-rails - Golang duplicate rails 设计 gem 密码加密

sockets - 非常偶发的 Go HTTP 错误 : multiple response. WriteHeader 调用

postgresql - 如何从go app查看postgresql "raise notice"

java - 如何使用Java遍历类及其成员类的对象