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/vxQ 著作权归作者所有。请勿转载和采集!