github.com/cristalhq/netx@v0.0.0-20221116164110-442313ef3309/connpool.go (about) 1 package netx 2 3 import ( 4 "context" 5 "net" 6 ) 7 8 type ConnPool struct { 9 connCh chan net.Conn 10 } 11 12 func NewConnPool(addr string, size int) (*ConnPool, error) { 13 p := &ConnPool{ 14 connCh: make(chan net.Conn, size), 15 } 16 17 for i := 0; i < size; i++ { 18 conn, err := net.Dial("tcp", addr) 19 if err != nil { 20 return nil, err 21 } 22 p.connCh <- conn 23 } 24 return p, nil 25 } 26 27 func (p *ConnPool) Acquire(ctx context.Context) (net.Conn, error) { 28 select { 29 case <-ctx.Done(): 30 return nil, ctx.Err() 31 case conn := <-p.connCh: 32 return conn, nil 33 } 34 } 35 36 func (p *ConnPool) Release(conn net.Conn) { 37 p.connCh <- conn 38 }