我一直在寻找并为此苦苦挣扎。我发现了另一个 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
打印出 val
和 reflect.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/