ZBLOG

golang 深拷贝结构体

在 Go 语言中,结构体的深拷贝可以通过逐个复制字段的方式来实现。以下是一个示例代码:

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type Person struct {
  7. Name string
  8. Age int
  9. }
  10. func DeepCopy(source interface{}) interface{} {
  11. sourceValue := reflect.ValueOf(source)
  12. if sourceValue.Kind() != reflect.Struct {
  13. return nil
  14. }
  15. newValue := reflect.New(sourceValue.Type()).Elem()
  16. for i := 0; i < sourceValue.NumField(); i++ {
  17. field := newValue.Field(i)
  18. fieldValue := sourceValue.Field(i)
  19. if fieldValue.Kind() == reflect.Ptr {
  20. if !field.CanSet() || fieldValue.IsNil() {
  21. continue
  22. }
  23. field.Set(reflect.New(field.Type().Elem()))
  24. field.Elem().Set(reflect.Indirect(fieldValue).Addr())
  25. } else if fieldValue.Kind() == reflect.Struct {
  26. subStructCopy := DeepCopy(fieldValue.Interface())
  27. if subStructCopy != nil {
  28. field.Set(reflect.ValueOf(subStructCopy))
  29. }
  30. } else {
  31. if field.CanSet() && fieldValue.IsValid() {
  32. field.Set(fieldValue)
  33. }
  34. }
  35. }
  36. return newValue.Interface()
  37. }
  38. func main() {
  39. p1 := Person{Name: "Alice", Age: 25}
  40. p2 := DeepCopy(p1).(Person)
  41. fmt.Println("p1:", p1)
  42. fmt.Println("p2:", p2)
  43. p2.Name = "Bob"
  44. p2.Age = 30
  45. fmt.Println("After modification:")
  46. fmt.Println("p1:", p1)
  47. fmt.Println("p2:", p2)
  48. }

运行上述代码,会输出以下结果:

  1. p1: {Alice 25}
  2. p2: {Alice 25}
  3. After modification:
  4. p1: {Alice 25}
  5. p2: {Bob 30}

可以看到,通过 DeepCopy 函数实现了对结构体的深拷贝。请注意,在深拷贝过程中,指针字段会被重新创建,并且子结构体也会进行递归的深拷贝。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?