为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用反射在 Go 中查找空结构值?

如何使用反射在 Go 中查找空结构值?

Go
噜噜哒 2023-04-17 14:51:29
我一直在寻找并为此苦苦挣扎了一段时间。我发现了另一个 Stack Overflow 问题,它让我朝着正确的方向前进但没有用:Quick way to detect empty values via reflection in Go。我当前的代码如下所示:structIterator := reflect.ValueOf(user)for i := 0; i < structIterator.NumField(); i++ {    field := structIterator.Type().Field(i).Name    val := structIterator.Field(i).Interface()    // Check if the field is zero-valued, meaning it won't be updated    if reflect.DeepEqual(val, reflect.Zero(structIterator.Field(i).Type()).Interface()) {        fmt.Printf("%v is non-zero, adding to update\n", field)        values = append(values, val)    }}然而,我fmt.Printf打印出了 theval和reflect.ZeroI have,即使它们相同,它仍然进入语句if并且每个字段都被读取为非零,即使显然不是这种情况。我究竟做错了什么?我不需要更新字段,如果它们不为零,只需将它们添加到切片值中。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

对于初学者,如果IS为零值,则添加val到切片中,如果不是,则不添加。所以你应该检查而不是你有什么。除此之外,您的代码似乎工作正常:valuesval if !reflect.DeepEqual(...


package main


import (

    "fmt"

    "reflect"

)


type User struct {

    Name  string

    Age   int

    Email string

}


func main() {


    user, values := User{Name: "Bob", Age: 32}, []interface{}(nil)


    structIterator := reflect.ValueOf(user)

    for i := 0; i < structIterator.NumField(); i++ {

        field := structIterator.Type().Field(i).Name

        val := structIterator.Field(i).Interface()


        // Check if the field is zero-valued, meaning it won't be updated

        if !reflect.DeepEqual(val, reflect.Zero(structIterator.Field(i).Type()).Interface()) {

            fmt.Printf("%v is non-zero, adding to update\n", field)

            values = append(values, val)

        }

    }

}

输出以下内容(Go Playground Link):


Name is non-zero, adding to update

Age is non-zero, adding to update

因此,正确地看到该Email字段未初始化(或更正确地,包含 的零值string)。


查看完整回答
反对 回复 2023-04-17
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信