ZBLOG

golang 深拷贝结构体

在 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=18475

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?