bash
package main
import (
"fmt"
"net"
)
func GetFreePort() (int, error) {
// 监听本地 0 端口,让系统自动分配可用端口
listener, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
return 0, err
}
defer listener.Close() // 记得关闭 listener,释放端口
addr := listener.Addr().(*net.TCPAddr)
return addr.Port, nil
}
func main() {
port, err := GetFreePort()
if err != nil {
fmt.Println("获取端口失败:", err)
return
}
fmt.Println("可用端口:", port)
}
核心思路
-
net.Listen("tcp", "127.0.0.1:0"):端口填 0 表示自动分配。
-
listener.Addr().(*net.TCPAddr).Port:获取系统分配的端口。
-
defer listener.Close():释放监听,避免端口被占用。