gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/registry/util.go (about) 1 package registry 2 3 func addNodes(old, neu []*Node) []*Node { 4 nodes := make([]*Node, len(neu)) 5 // add all new nodes 6 for i, n := range neu { 7 node := *n 8 nodes[i] = &node 9 } 10 11 // look at old nodes 12 for _, o := range old { 13 var exists bool 14 15 // check against new nodes 16 for _, n := range nodes { 17 // ids match then skip 18 if o.Id == n.Id { 19 exists = true 20 break 21 } 22 } 23 24 // keep old node 25 if !exists { 26 node := *o 27 nodes = append(nodes, &node) 28 } 29 } 30 31 return nodes 32 } 33 34 func delNodes(old, del []*Node) []*Node { 35 var nodes []*Node 36 for _, o := range old { 37 var rem bool 38 for _, n := range del { 39 if o.Id == n.Id { 40 rem = true 41 break 42 } 43 } 44 if !rem { 45 nodes = append(nodes, o) 46 } 47 } 48 return nodes 49 } 50 51 // CopyService make a copy of service 52 func CopyService(service *Service) *Service { 53 // copy service 54 s := new(Service) 55 *s = *service 56 57 // copy nodes 58 nodes := make([]*Node, len(service.Nodes)) 59 for j, node := range service.Nodes { 60 n := new(Node) 61 *n = *node 62 nodes[j] = n 63 } 64 s.Nodes = nodes 65 66 // copy endpoints 67 eps := make([]*Endpoint, len(service.Endpoints)) 68 for j, ep := range service.Endpoints { 69 e := new(Endpoint) 70 *e = *ep 71 eps[j] = e 72 } 73 s.Endpoints = eps 74 return s 75 } 76 77 // Copy makes a copy of services 78 func Copy(current []*Service) []*Service { 79 services := make([]*Service, len(current)) 80 for i, service := range current { 81 services[i] = CopyService(service) 82 } 83 return services 84 } 85 86 // Merge merges two lists of services and returns a new copy 87 func Merge(olist []*Service, nlist []*Service) []*Service { 88 var srv []*Service 89 90 for _, n := range nlist { 91 var seen bool 92 for _, o := range olist { 93 if o.Version == n.Version { 94 sp := new(Service) 95 // make copy 96 *sp = *o 97 // set nodes 98 sp.Nodes = addNodes(o.Nodes, n.Nodes) 99 100 // mark as seen 101 seen = true 102 srv = append(srv, sp) 103 break 104 } else { 105 sp := new(Service) 106 // make copy 107 *sp = *o 108 srv = append(srv, sp) 109 } 110 } 111 if !seen { 112 srv = append(srv, Copy([]*Service{n})...) 113 } 114 } 115 return srv 116 } 117 118 // Remove removes services and returns a new copy 119 func Remove(old, del []*Service) []*Service { 120 var services []*Service 121 122 for _, o := range old { 123 srv := new(Service) 124 *srv = *o 125 126 var rem bool 127 128 for _, s := range del { 129 if srv.Version == s.Version { 130 srv.Nodes = delNodes(srv.Nodes, s.Nodes) 131 132 if len(srv.Nodes) == 0 { 133 rem = true 134 } 135 } 136 } 137 138 if !rem { 139 services = append(services, srv) 140 } 141 } 142 143 return services 144 }