可以使用反射来判断结构体中的字段的值是否为空值,具体实现如下:

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 函数只考虑了常见的数据类型,如果结构体中包含了自定义类型的字段,则需要针对自定义类型的零值进行判断。

golang 结构体嵌套 判断值是否空值

原文地址: https://www.cveoy.top/t/topic/vxQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录