什么是Go的net.Listener Addr()用于?

时间:2018-06-10 05:47:13

标签: 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()但接受和关闭的连接就好了,会有什么影响?

2 个答案:

答案 0 :(得分:8)

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

例如,使用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

答案 1 :(得分:5)

为了添加到Patrick的答案,2009年6月在commit 5d2ee9d的Go1.0中添加了对{\ n}}接口的特定方法Addr()

当时的原因是:

  

将Addr()字符串添加到net.Listener接口。

     

使用它来避免在测试中使用固定端口。

这样net/server_test.go可以监听任何可用的端口,并且仍然可以找回确切的地址。

Listener

if network == "tcp" { listenaddr += ":0"; // any available port } go runServe(t, network, listenaddr, listening, done); addr := <-listening; // wait for server to start 使用runServe()方法通过频道返回地址:

Addr()