github.com/sandwich-go/boost@v1.3.29/xcopy/README.md (about)

     1  # xcopy
     2  
     3  深拷贝
     4  
     5  - 若实现 Clone() [proto1](https://github.com/golang/protobuf/tree/master/proto).Message 接口,可快速深拷贝
     6  - 若实现 Clone() [proto2](https://github.com/protocolbuffers/protobuf-go/tree/master/proto).Message 接口,可快速深拷贝
     7  - 若实现 `DeepCopy() interface{}` 接口,可快速深拷贝
     8  - 其他形式则通过反射进行深拷贝
     9  
    10  
    11  **注意** :
    12  - 通过反射进行深拷贝时,注意未导出的属性,**未导出的属性无法拷贝**
    13  
    14  # 例子
    15  ```go
    16  type sub0 struct {
    17      i uint32    // 含有未导出的属性,无法深拷贝
    18  }
    19  
    20  type sub1 struct {
    21      i uint32    // 含有未导出的属性,但实现了 Clone() proto1.Message、Clone() proto2.Message、DeepCopyInterface,可以深拷贝
    22  }
    23  
    24  func (s *sub1) DeepCopy() interface{} {
    25      if s == nil {
    26          return s
    27      }
    28      return &sub1{i: s.i}
    29  }
    30  
    31  type sub2 struct{
    32      I uint32    // 没有未导出的属性,可以深拷贝
    33  }
    34  
    35  func main() {
    36      var s0 = &sub0{i: 1}            // 不会进行拷贝
    37      var s1 = &sub1{i: 2}
    38      var s2 = &sub2{I: 3}
    39  	
    40      fmt.Println(DeepCopy(s0).i)
    41      fmt.Println(DeepCopy(s1).i)
    42      fmt.Println(DeepCopy(s2).i)
    43  }
    44  ```
    45  
    46  Output:
    47  ```text
    48  0
    49  2
    50  3
    51  ```