duancongjue9202 2017-02-28 14:54
浏览 317
已采纳

golang DeepEqual和reflect.Zero

I'm trying to check if a field in a struct is set to its zero value with reflect.DeepEqual. The idea is that if it is the case, I can change its value with a default one given as a struct tag like following :

type struct {
    A int `default:"42"`
}

My problem is the following : It looks like reflect.DeepEqual is always returning me false. I think I'm missing something. Here is a simple example of what I'm trying to do:

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

And here is a go playground version of the code above : https://play.golang.org/p/k9VY-2Dc69

I would like to know why DeepEqual is returning false in this case.

Thanks!

  • 写回答

2条回答 默认 最新

  • douyamitong57935 2017-02-28 14:56
    关注

    Here:

    reflect.DeepEqual(field.Interface(), reflect.Zero(field.Type()))
    

    You are comparing an int value (wrapped in interface{}), to a value of type reflect.Value. reflect.Zero() returns a value of type reflect.Value, not interface{}.

    You forgot to call Value.Interface() on the 2nd argument:

    reflect.DeepEqual(field.Interface(), reflect.Zero(field.Type()).Interface())
    

    This prints true. Try it on the Go Playground.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了