refactor(tool): 为DeepCopy和ShallowCopy添加配置选项支持
为copy工具函数添加了CopyOption配置选项,允许调用方自定义复制行为。主要修改包括: 1. 新增CopyOption函数类型和CopyWithIgnoreEmpty选项 2. 修改DeepCopy和ShallowCopy函数签名以支持可变选项参数 3. 重构内部实现以应用传入的选项配置 这使得调用方可以灵活控制是否忽略空值等复制行为,增强了工具函数的可配置性。
This commit is contained in:
+32
-8
@@ -13,17 +13,28 @@ import (
|
||||
"github.com/perfect-panel/server/pkg/constant"
|
||||
)
|
||||
|
||||
func DeepCopy[T, K interface{}](destStruct T, srcStruct K) T {
|
||||
// CopyOption 定义复制选项的函数类型
|
||||
type CopyOption func(*copier.Option)
|
||||
|
||||
// CopyWithIgnoreEmpty 设置是否忽略空值
|
||||
func CopyWithIgnoreEmpty(ignoreEmpty bool) CopyOption {
|
||||
return func(o *copier.Option) {
|
||||
o.IgnoreEmpty = ignoreEmpty
|
||||
}
|
||||
}
|
||||
|
||||
func DeepCopy[T, K any](destStruct T, srcStruct K, opts ...CopyOption) T {
|
||||
var dst = destStruct
|
||||
var src = srcStruct
|
||||
_ = copier.CopyWithOption(dst, src, copier.Option{
|
||||
|
||||
option := copier.Option{
|
||||
DeepCopy: true,
|
||||
IgnoreEmpty: true,
|
||||
Converters: []copier.TypeConverter{
|
||||
{
|
||||
SrcType: time.Time{},
|
||||
DstType: constant.Int64,
|
||||
Fn: func(src interface{}) (interface{}, error) {
|
||||
Fn: func(src any) (any, error) {
|
||||
s, ok := src.(time.Time)
|
||||
if !ok {
|
||||
return nil, errors.New("src type not matching")
|
||||
@@ -32,13 +43,21 @@ func DeepCopy[T, K interface{}](destStruct T, srcStruct K) T {
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
opt(&option)
|
||||
}
|
||||
|
||||
_ = copier.CopyWithOption(dst, src, option)
|
||||
return dst
|
||||
}
|
||||
func ShallowCopy[T, K interface{}](destStruct T, srcStruct K) T {
|
||||
|
||||
func ShallowCopy[T, K interface{}](destStruct T, srcStruct K, opts ...CopyOption) T {
|
||||
var dst = destStruct
|
||||
var src = srcStruct
|
||||
_ = copier.CopyWithOption(dst, src, copier.Option{
|
||||
|
||||
option := copier.Option{
|
||||
IgnoreEmpty: true,
|
||||
Converters: []copier.TypeConverter{
|
||||
{
|
||||
@@ -46,7 +65,6 @@ func ShallowCopy[T, K interface{}](destStruct T, srcStruct K) T {
|
||||
DstType: constant.Int64,
|
||||
Fn: func(src interface{}) (interface{}, error) {
|
||||
s, ok := src.(time.Time)
|
||||
|
||||
if !ok {
|
||||
return nil, errors.New("src type not matching")
|
||||
}
|
||||
@@ -54,7 +72,13 @@ func ShallowCopy[T, K interface{}](destStruct T, srcStruct K) T {
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
opt(&option)
|
||||
}
|
||||
|
||||
_ = copier.CopyWithOption(dst, src, option)
|
||||
return dst
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user