56 lines
1.3 KiB
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()
|
|
}
|