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 ```