Golang 结构体嵌套判断空值:使用反射高效检测
可以使用反射来判断结构体中的字段的值是否为空值,具体实现如下:
import "reflect"
type User struct {
Name string
Age int
}
type Manager struct {
User
Title string
}
func isZeroValue(v reflect.Value) bool {
switch v.Kind() {
case reflect.String:
return v.Len() == 0
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return v.Int() == 0
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return v.Uint() == 0
case reflect.Float32, reflect.Float64:
return v.Float() == 0
case reflect.Bool:
return !v.Bool()
case reflect.Ptr, reflect.Interface:
return v.IsNil()
case reflect.Struct:
for i := 0; i < v.NumField(); i++ {
if !isZeroValue(v.Field(i)) {
return false
}
}
return true
default:
return false
}
}
func main() {
m := Manager{
User: User{Name: 'Alice', Age: 18},
Title: 'Manager',
}
v := reflect.ValueOf(m)
for i := 0; i < v.NumField(); i++ {
if isZeroValue(v.Field(i)) {
println('field', v.Type().Field(i).Name, 'is empty')
} else {
println('field', v.Type().Field(i).Name, 'is not empty')
}
}
}
输出结果如下:
field Name is not empty
field Age is not empty
field Title is not empty
注意,上述代码中的 isZeroValue 函数只考虑了常见的数据类型,如果结构体中包含了自定义类型的字段,则需要针对自定义类型的零值进行判断。
原文地址: https://www.cveoy.top/t/topic/lIbu 著作权归作者所有。请勿转载和采集!