当程序不指定server端口时,server需要自动监听一个可用端口进行启动,这样的需求能实现吗?

答案肯定是可以的。

传入的地址为::0,即可自动寻找可用端口进行监听。

1
2
3
4
5
6
7
8
9
func main() {
listener, err := net.Listen("tcp4", "localhost:0")
if err != nil {
log.Panic("server start error :", err)
}
defer listener.Close()

fmt.Println(listener.Addr().String())
}

假如,我想在gin框架上这样操作呢?这样也是可行的,只不过你会发现,我们无法打印出获取的端口号。

1
2
3
4
func main() {
router := gin.Default()
http.ListenAndServe("localhost:0", router)
}

那我们可以自己创建Listen,不使用库。

1
2
3
4
5
6
7
8
9
10
func main() {
r := gin.Default()

ln, _ := net.Listen("tcp", "localhost:0")

_, port, _ := net.SplitHostPort(ln.Addr().String())
fmt.Println("Listening on port", port, ln.Addr().String())

http.Serve(ln, r)
}