在 Go 语言中,可以使用反射来判断嵌套结构体是否为空。

示例代码如下:

package main

import (
    "fmt"
    "reflect"
)

type Address struct {
    Province string
    City     string
}

type User struct {
    Name    string
    Age     int
    Address Address
}

func IsEmpty(v interface{}) bool {
    if v == nil {
        return true
    }

    value := reflect.ValueOf(v)

    switch value.Kind() {
    case reflect.String, reflect.Array, reflect.Slice, reflect.Map:
        return value.Len() == 0
    case reflect.Struct:
        for i := 0; i < value.NumField(); i++ {
            field := value.Field(i)
            if !IsEmpty(field.Interface()) {
                return false
            }
        }
        return true
    }

    return false
}

func main() {
    user1 := User{Name: "张三", Age: 18, Address: Address{Province: "广东省", City: "深圳市"}}
    user2 := User{Name: "李四", Age: 20, Address: Address{}}

    fmt.Println(IsEmpty(user1)) // false
    fmt.Println(IsEmpty(user2)) // true
}

上面的代码定义了 AddressUser 两个结构体,并定义了一个 IsEmpty 函数用于判断结构体是否为空。

IsEmpty 函数中,首先判断传入的参数是否为空,如果为空则直接返回 true。

然后使用反射获取传入参数的值,根据值的类型进行判断:

  • 如果是字符串、数组、切片、映射类型,则判断长度是否为 0。
  • 如果是结构体类型,则遍历结构体的每个字段,判断字段的值是否为空。

最后,如果传入的参数既不是字符串、数组、切片、映射类型,也不是结构体类型,则直接返回 false。

使用示例中,我们分别创建了一个非空的 User 结构体和一个空的 User 结构体,并分别调用 IsEmpty 函数进行判断,可以得到正确的结果。

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

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

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