如何获取 http.ListenAndServe 的地址

假设我像这样启动服务器:


srv := http.Server{

    Addr:    ":0",

    Handler: http.FileServer(http.Dir(".")),

}

go srv.ListenAndServe()

log.Printf("Listening on ???")

我怎么知道选择了哪个端口?:0旨在由操作系统选择一个随机的临时端口,但我需要知道选择了哪个端口。


注意:我宁愿不创建自己的监听器和使用srv.Listen(ln),由于srv.ListenAndServe()具有良好的默认值(但不导出),我想使用监听器。


PIPIONE
浏览 237回答 3
3回答

holdtom

我不想创建我自己的侦听器并使用 srv.Listen(ln),因为 srv.ListenAndServe() 有一个我想使用的很好的默认(但未导出)侦听器。为什么不?ListenAndServe() 实现起来非常简单。你可以自己阅读源代码:func (srv *Server) ListenAndServe() error {    addr := srv.Addr    if addr == "" {        addr = ":http"    }    ln, err := net.Listen("tcp", addr)    if err != nil {        return err    }    return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})}答案是您需要使用自己编写的 ListenAndServe() 来提供您想要的信息。然而,这比您相信的要容易得多。整个事情不超过 20 行(假设您想使用tcpKeepAliveListener设置 keep- alives)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go