go copy object deep深拷贝
GOLANG 深拷贝:
package main import ( "fmt" "reflect" ) func DeepCopy(src interface{}) interface{} { if src == nil { return nil } srcVal := reflect.ValueOf(src) if srcVal.Kind() == reflect.Ptr && srcVal.IsNil() { return nil } copy := reflect.New(srcVal.Type()).Elem() deepCopyRecursive(srcVal, copy) return copy.Interface() } func deepCopyRecursive(src, dst reflect.Value) { switch src.Kind() { case reflect.Ptr: if src.IsNil() { return } dst.Set(reflect.New(src.Elem().Type())) deepCopyRecursive(src.Elem(), dst.Elem()) case reflect.Slice: if src.IsNil() { return } dst.Set(reflect.MakeSlice(src.Type(), src.Len(), src.Cap())) for i := 0; i < src.Len(); i++ { deepCopyRecursive(src.Index(i), dst.Index(i)) } case reflect.Map: if src.IsNil() { return } dst.Set(reflect.MakeMap(src.Type())) for _, key := range src.MapKeys() { val := src.MapIndex(key) copyVal := reflect.New(val.Type()).Elem() deepCopyRecursive(val, copyVal) dst.SetMapIndex(key, copyVal) } case reflect.Struct: for i := 0; i < src.NumField(); i++ { deepCopyRecursive(src.Field(i), dst.Field(i)) } default: dst.Set(src) } } type Address struct{ City string } type Person struct { Name string Address *Address } func main() { orig := &Person{Name: "Alice", Address: &Address{City: "Paris"}} copy := DeepCopy(orig).(*Person) copy.Address.City = "Berlin" fmt.Printf("Original: %+v\n", orig.Address) // 输出Paris fmt.Printf("Copy: %+v\n", copy.Address) // 输出Berlin }
浙公网安备 33010602011771号