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
}

 

posted @ 2025-10-06 17:58  calochCN  阅读(6)  评论(0)    收藏  举报