【问题标题】:How to find empty struct values in Go using reflection?如何使用反射在 Go 中找到空的结构值?
【发布时间】:2018-09-29 05:55:45
【问题描述】:

我一直在寻找并为此苦苦挣扎了一段时间。我发现了另一个 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 语句,并且每个字段都被读取为非-zero 即使显然不是这样。我究竟做错了什么?我不需要更新字段,如果它们不为零,只需将它们添加到切片 values

【问题讨论】:

    标签: go reflection


    【解决方案1】:

    首先,如果val IS 为零值,则将val 添加到values 切片中,而不是如果不是。所以你可能应该检查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 的零值)。

    【讨论】:

    • 是的,我很笨,我只需要一个感叹号来撤销支票。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多