golang 判断嵌套结构体是否为空
在 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
}
上面的代码定义了 Address 和 User 两个结构体,并定义了一个 IsEmpty 函数用于判断结构体是否为空。
在 IsEmpty 函数中,首先判断传入的参数是否为空,如果为空则直接返回 true。
然后使用反射获取传入参数的值,根据值的类型进行判断:
- 如果是字符串、数组、切片、映射类型,则判断长度是否为 0。
- 如果是结构体类型,则遍历结构体的每个字段,判断字段的值是否为空。
最后,如果传入的参数既不是字符串、数组、切片、映射类型,也不是结构体类型,则直接返回 false。
使用示例中,我们分别创建了一个非空的 User 结构体和一个空的 User 结构体,并分别调用 IsEmpty 函数进行判断,可以得到正确的结果。
原文地址: https://www.cveoy.top/t/topic/vxH 著作权归作者所有。请勿转载和采集!