MCPcopy
hub / github.com/name5566/leaf / deepCopy

Function deepCopy

util/deepcopy.go:8–51  ·  view source on GitHub ↗
(dst, src reflect.Value)

Source from the content-addressed store, hash-verified

6)
7
8func deepCopy(dst, src reflect.Value) {
9 switch src.Kind() {
10 case reflect.Interface:
11 value := src.Elem()
12 if !value.IsValid() {
13 return
14 }
15 newValue := reflect.New(value.Type()).Elem()
16 deepCopy(newValue, value)
17 dst.Set(newValue)
18 case reflect.Ptr:
19 value := src.Elem()
20 if !value.IsValid() {
21 return
22 }
23 dst.Set(reflect.New(value.Type()))
24 deepCopy(dst.Elem(), value)
25 case reflect.Map:
26 dst.Set(reflect.MakeMap(src.Type()))
27 keys := src.MapKeys()
28 for _, key := range keys {
29 value := src.MapIndex(key)
30 newValue := reflect.New(value.Type()).Elem()
31 deepCopy(newValue, value)
32 dst.SetMapIndex(key, newValue)
33 }
34 case reflect.Slice:
35 dst.Set(reflect.MakeSlice(src.Type(), src.Len(), src.Cap()))
36 for i := 0; i < src.Len(); i++ {
37 deepCopy(dst.Index(i), src.Index(i))
38 }
39 case reflect.Struct:
40 typeSrc := src.Type()
41 for i := 0; i < src.NumField(); i++ {
42 value := src.Field(i)
43 tag := typeSrc.Field(i).Tag
44 if value.CanSet() && tag.Get("deepcopy") != "-" {
45 deepCopy(dst.Field(i), value)
46 }
47 }
48 default:
49 dst.Set(src)
50 }
51}
52
53func DeepCopy(dst, src interface{}) {
54 typeDst := reflect.TypeOf(dst)

Callers 2

DeepCopyFunction · 0.85
DeepCloneFunction · 0.85

Calls 4

SetMethod · 0.80
IndexMethod · 0.80
GetMethod · 0.80
LenMethod · 0.45

Tested by

no test coverage detected