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

标签 go reflection

我一直在寻找并为此苦苦挣扎。我发现了另一个 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 打印出 valreflect.Zero 我有,即使它们都是同样,它仍然进入 if 语句并且每个字段都被读取为非零,即使显然不是这种情况。我究竟做错了什么?我不需要更新字段,如果它们不为零,只需将它们添加到 slice values

最佳答案

对于初学者来说,如果 val IS 是零值,则将 val 添加到 values slice ,而不是如果不是的话。所以你应该检查 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 的零值)。

关于go - 如何使用反射在 Go 中查找空结构值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52562373/

相关文章:

Go导入返回 "unused import"

go - 更新作为接口(interface)传递的函数内部的结构字段

Java 属性注释标准/库

xml - 无法使用 golang 解码 XML,始终为空结构

c# - 如何获取代码所在程序集的路径?

java - 如何直接在 android 中从 HashMap 设置对象字段

c# - HasThis 和 ExplicitThis 调用约定

postgresql - postgres 准备查询,列作为变量

go - Go安装程序未安装“开始”菜单组而不是“科学”

ssl - Golang : http2 and TLS handshake errors