繁体   English   中英

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

[英]How to find empty struct values in Go using reflection?

我一直在寻找,并为此付出了一些努力。 我发现了另一个另一个Stack Overflow问题,该问题使我朝着正确的方向前进,但没有用: 通过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语句,每个字段都读为非零,即使这很明显并非如此。 我究竟做错了什么? 我不需要更新字段,只需将它们添加到切片值(如果它们不为零)。

对于初学者来说,要添加valvalues切片如果val 零值,而不是如果它不是。 因此,您可能应该检查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)
        }
    }
}

输出以下内容( 转到Playground Link ):

Name is non-zero, adding to update
Age is non-zero, adding to update

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM