From 70bd9332b0a9d5b89676f67e5755ae39da87dcef Mon Sep 17 00:00:00 2001
From: Ian Luo <ian.luo@gmail.com>
Date: Tue, 18 Aug 2020 14:37:27 +0800
Subject: [PATCH] avoid reflection api

---
 cluster/router/chain/chain.go | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/cluster/router/chain/chain.go b/cluster/router/chain/chain.go
index 369f24b3c..353ea82b4 100644
--- a/cluster/router/chain/chain.go
+++ b/cluster/router/chain/chain.go
@@ -18,7 +18,6 @@
 package chain
 
 import (
-	"reflect"
 	"sort"
 	"sync"
 	"sync/atomic"
@@ -141,8 +140,9 @@ func (c *RouterChain) loop() {
 func (c *RouterChain) copyRouters() []router.PriorityRouter {
 	c.mutex.RLock()
 	defer c.mutex.RUnlock()
-	ret := copySlice(c.routers)
-	return ret.([]router.PriorityRouter)
+	ret := make([]router.PriorityRouter, 0, len(c.routers))
+	ret = append(ret, c.routers...)
+	return ret
 }
 
 // copyInvokers copies a snapshot of the received invokers.
@@ -152,15 +152,9 @@ func (c *RouterChain) copyInvokers() []protocol.Invoker {
 	if c.invokers == nil || len(c.invokers) == 0 {
 		return nil
 	}
-	ret := copySlice(c.invokers)
-	return ret.([]protocol.Invoker)
-}
-
-func copySlice(s interface{}) interface{} {
-	t, v := reflect.TypeOf(s), reflect.ValueOf(s)
-	c := reflect.MakeSlice(t, v.Len(), v.Len())
-	reflect.Copy(c, v)
-	return c.Interface()
+	ret := make([]protocol.Invoker, 0, len(c.invokers))
+	ret = append(ret, c.invokers...)
+	return ret
 }
 
 // loadCache loads cache from sync.Value to guarantee the visibility
-- 
GitLab