$ uname
Darwin
$ go version
go version go1.13.10 darwin/amd64
NewMultiPool函数,servers初始化为make([]string, len(addresses)), servers此时的len为len(addresses), cap为len(addresses)
func NewMultiPool(addresses []string, maxConnNum, maxIdleNum int, maxIdleSeconds int64) *MultiPool {
mp := &MultiPool{
pools: make(map[string]*Pool, len(addresses)),
servers: make([]string, len(addresses)),
maxConnNum: maxConnNum,
maxIdleNum: maxIdleNum,
maxIdleSeconds: maxIdleSeconds,
}
for _, addr := range addresses {
mp.AddPool(addr)
}
return mp
}
AddPool函数,下列语句将address append到servers后,servers的前len(addresses)的位置是空的,所以PopByKey时,servers的len实际是2 * len(addresses) 所以每次pop出来的都是空指针。
func (mp *MultiPool) AddPool(address string) (*Pool, bool) {
...
mp.servers = append(mp.servers, address)
...
}
func TestMultiOnce(t *testing.T) {
addresses := []string{"127.0.0.1:9991:1234567890"}
addr := "127.0.0.1:9991:1234567890"
mp := NewMultiPool(addresses, 50, 20, 9)
go func() {
for {
fmt.Println("-----------" + mp.Info())
}
}()
time.Sleep(time.Second)
for i := 0; i < 100; i++ {
mp.Call(addr).SET("a", "a")
}
time.Sleep(time.Second)
for i := 0; i < 100; i++ {
c := mp.PopByAddr(addr)
if c != nil {
c.SET("a", "a")
} else {
fmt.Println("c==nil")
}
mp.Push(c)
}
for i := 0; i < 100; i++ {
c := mp.PopByKey("a")
if c != nil {
c.SET("a", "a")
} else {
fmt.Println("c==nil")
}
mp.PushByKey("a", c)
}
time.Sleep(10e9)
}
NewMultiPool函数,servers初始化为make([]string, len(addresses)), servers此时的len为len(addresses), cap为len(addresses)
AddPool函数,下列语句将address append到servers后,servers的前len(addresses)的位置是空的,所以PopByKey时,servers的len实际是2 * len(addresses) 所以每次pop出来的都是空指针。