test.go
 1package test
 2
 3import (
 4	"net"
 5	"sync"
 6)
 7
 8var (
 9	used = map[int]struct{}{}
10	lock sync.Mutex
11)
12
13// RandomPort returns a random port number.
14// This is mainly used for testing.
15func RandomPort() int {
16	addr, _ := net.Listen("tcp", ":0") //nolint:gosec
17	_ = addr.Close()
18	port := addr.Addr().(*net.TCPAddr).Port
19	lock.Lock()
20
21	if _, ok := used[port]; ok {
22		lock.Unlock()
23		return RandomPort()
24	}
25
26	used[port] = struct{}{}
27	lock.Unlock()
28	return port
29}