我编写了一个简单的Web服务器来监听端口8080.但我不想使用硬编码的端口号.我想要的是我的服务器侦听任何可用的端口.我想知道我的Web服务器正在监听的端口号是什么.
我的代码如下:
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
我编写了一个简单的Web服务器来监听端口8080.但我不想使用硬编码的端口号.我想要的是我的服务器侦听任何可用的端口.我想知道我的Web服务器正在监听的端口号是什么.
我的代码如下:
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
您可以使用端口0
来表示您没有指定确切的端口,但您希望系统 Select 一个空闲的可用端口:
http.ListenAndServe(":0", nil)
这样做的问题是,您将无法找到分配的端口.因此,您需要自己创建net.Listener
(使用net.Listen()
函数),并手动将其传递给http.Serve()
:
listener, err := net.Listen("tcp", ":0")
if err != nil {
panic(err)
}
fmt.Println("Using port:", listener.Addr().(*net.TCPAddr).Port)
panic(http.Serve(listener, nil))
输出示例:
Using port: 42039
如您所见,您可以从net.Listener
从其net.Addr
地址(通过其Addr()
方法获取)访问分配的端口.net.Addr
不直接提供对端口的访问,但由于我们使用tcp
网络流创建了net.Listener
,net.Addr
将是动态类型*net.TCPAddr
(我们可以使用type assertion获取),这是一个 struct ,有一个字段Port int
.
请注意,如果您的应用程序中不需要端口(例如,您只想自己显示它),您不需要类型断言,您可以只打印listener.Addr()
(最后将包含端口):
fmt.Println("Address:", listener.Addr())
输出示例:
Address: [::]:42039
另外,不要忘记处理返回的错误(本例中为http.ListenAndServe()
).在我的示例中,我只是将其传递给panic()
,因为如果一切顺利,http.LitenAndServe()
和http.Serve()
将阻塞(因此,只有当出现错误时,它们才会返回,我将其传递给panic()
).