package pool import "fmt" type PortAllocator struct { ports chan int } func NewPortAllocator(lo, hi int) *PortAllocator { ch := make(chan int, hi-lo+1) for p := lo; p <= hi; p++ { ch <- p } return &PortAllocator{ports: ch} } func (pa *PortAllocator) Allocate() (int, error) { select { case p := <-pa.ports: return p, nil default: return 0, fmt.Errorf("port allocator exhausted") } } func (pa *PortAllocator) Release(port int) { pa.ports <- port }