Files
mayfly-go/server/pkg/utils/structx/reflect.go
2026-04-15 12:47:10 +08:00

44 lines
1.3 KiB
Go

package structx
import "reflect"
// IsZeroValue 检查字段是否为零值
func IsZeroValue(v reflect.Value) bool {
switch v.Kind() {
case reflect.String:
return v.String() == ""
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.Bool:
return !v.Bool()
case reflect.Float32, reflect.Float64:
return v.Float() == 0
case reflect.Ptr, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice:
return v.IsNil()
default:
return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface())
}
}
// newInstance 创建一个 T 类型的实例
// 如果 T 是指针类型 (*A),它返回 new(A) 并转换为 *A
// 如果 T 是值类型 (A),它返回 new(A) 的解引用值 A (即零值),或者根据需求调整
func NewInstance[T any]() T {
var t T
typ := reflect.TypeOf(t)
if typ.Kind() == reflect.Ptr {
// T 是 *SomeStruct
// 我们需要创建 SomeStruct 的实例,并返回其指针
elemType := typ.Elem()
v := reflect.New(elemType)
return v.Interface().(T)
} else {
// T 是 SomeStruct
// 返回零值结构体,或者返回 &SomeStruct{} (但这会改变类型)
return t
}
}