voucher/internal/pkg/helper/utils.go

56 lines
1.3 KiB
Go

package helper
import (
"os"
"reflect"
)
func FileExists(filePath string) bool {
_, err := os.Stat(filePath)
return err == nil || os.IsExist(err)
}
// DeepCopy 深拷贝函数
func DeepCopy(src interface{}) interface{} {
if src == nil {
return nil
}
t := reflect.TypeOf(src)
v := reflect.ValueOf(src)
// 创建新的对象
dst := reflect.New(t.Elem()).Elem()
// 遍历结构体的所有字段
for i := 0; i < t.Elem().NumField(); i++ {
field := t.Elem().Field(i)
srcField := v.Elem().Field(i)
dstField := dst.Field(i)
// 处理不同类型的字段
switch field.Type.Kind() {
case reflect.Map:
// 处理映射类型
newMap := reflect.MakeMap(field.Type)
for _, key := range srcField.MapKeys() {
value := srcField.MapIndex(key)
newMap.SetMapIndex(key, value)
}
dstField.Set(newMap)
case reflect.Slice:
// 处理切片类型
newSlice := reflect.MakeSlice(field.Type, srcField.Len(), srcField.Cap())
reflect.Copy(newSlice, srcField)
dstField.Set(newSlice)
case reflect.Ptr:
// 处理指针类型
if !srcField.IsNil() {
newPtr := reflect.New(field.Type.Elem())
newPtr.Elem().Set(DeepCopy(srcField.Elem()).(reflect.Value))
dstField.Set(newPtr)
}
default:
// 处理其他类型
dstField.Set(srcField)
}
}
return dst.Interface()
}