在 Go 语言中,结构体的深拷贝可以通过逐个复制字段的方式来实现。以下是一个示例代码:
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func DeepCopy(source interface{}) interface{} {
sourceValue := reflect.ValueOf(source)
if sourceValue.Kind() != reflect.Struct {
return nil
}
newValue := reflect.New(sourceValue.Type()).Elem()
for i := 0; i < sourceValue.NumField(); i++ {
field := newValue.Field(i)
fieldValue := sourceValue.Field(i)
if fieldValue.Kind() == reflect.Ptr {
if !field.CanSet() || fieldValue.IsNil() {
continue
}
field.Set(reflect.New(field.Type().Elem()))
field.Elem().Set(reflect.Indirect(fieldValue).Addr())
} else if fieldValue.Kind() == reflect.Struct {
subStructCopy := DeepCopy(fieldValue.Interface())
if subStructCopy != nil {
field.Set(reflect.ValueOf(subStructCopy))
}
} else {
if field.CanSet() && fieldValue.IsValid() {
field.Set(fieldValue)
}
}
}
return newValue.Interface()
}
func main() {
p1 := Person{Name: "Alice", Age: 25}
p2 := DeepCopy(p1).(Person)
fmt.Println("p1:", p1)
fmt.Println("p2:", p2)
p2.Name = "Bob"
p2.Age = 30
fmt.Println("After modification:")
fmt.Println("p1:", p1)
fmt.Println("p2:", p2)
}
运行上述代码,会输出以下结果:
p1: {Alice 25}
p2: {Alice 25}
After modification:
p1: {Alice 25}
p2: {Bob 30}
可以看到,通过 DeepCopy
函数实现了对结构体的深拷贝。请注意,在深拷贝过程中,指针字段会被重新创建,并且子结构体也会进行递归的深拷贝。
内容由零声教学AI助手提供,问题来源于学员提问