go - Go 的 net.Listener Addr() 有什么用?

标签 go

Go 的 net.Listener界面看起来像这样:

type Listener interface {
    // Accept waits for and returns the next connection to the listener.
    Accept() (Conn, error)

    // Close closes the listener.
    // Any blocked Accept operations will be unblocked and return errors.
    Close() error

    // Addr returns the listener's network address.
    Addr() Addr
}

但是 Addr 实际上是用来做什么的呢?如果我必须实现自己的监听器,它只返回一个空的 Addr().String() 但可以正常接受和关闭连接,那会有什么影响?

最佳答案

某些网络协议(protocol)允许您创建一个监听随机地址的监听器。当你想同时运行服务的多个实例时,通常会使用这种方法,因此你不能让它们都监听同一个地址。在这些情况下,内核会找到一个可用的,并将您的监听器放在那里。但是一旦你有了一个随机地址,你就需要知道那个地址是什么,这样你才能为它做广告。

例如,对于 TCP 和 UDP,您可以指定 0 作为您的端口号:

package main

import (
    "fmt"
    "net"
)

func main() {
    l, _ := net.Listen("tcp4", ":0")
    fmt.Printf("Addr: %s\n", l.Addr())
}

结果类似于:

Addr: 0.0.0.0:37733

关于go - Go 的 net.Listener Addr() 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50780921/

相关文章:

go - 在 go 中实现 io.WriterAt 的缓冲区

go - filepath.Join 删除点

go - 为什么这个零长度和零容量 slice 不为零?

json - 为每个 GET 请求创建一个新的 JSON 文件

android - 我可以将带有 HTML/JavaScript UI 的 Go Web 服务器作为跨平台应用程序运行吗(Linux、Android、iOS、macOS、Windows)

go - 如何用 Go 编程语言处理并行 HTTP 请求?

go - 如何使用 request.Context 而不是 CloseNotifier?

go - 为什么 RethinkDB 很慢?

Golan 超范围接口(interface){}

go - 如何将结构呈现为html模板?