Для чего используется net.Listener Addr () Go? - PullRequest
0 голосов
/ 10 июня 2018
Интерфейс

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?Если бы мне пришлось реализовать свой собственный Listener, который просто возвращал пустой Addr().String(), но принимал и закрывал соединения просто отлично, какие последствия это имело бы?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Чтобы добавить к ответу Патрика, этот конкретный метод Addr() для типа интерфейса Listener был добавлен в Go1.0 в июне 2009 года в commit 5d2ee9d .

Причина ввремя было:

добавить строку Addr () в интерфейс net.Listener.

использовать ее, чтобы избежать использования фиксированных портов в тестах.

Таким образом, net/server_test.go может прослушивать любой доступный порт и при этом возвращать точный адрес.

if network == "tcp" {
    listenaddr += ":0"; // any available port
}
go runServe(t, network, listenaddr, listening, done);
addr := <-listening; // wait for server to start

С runServe(), возвращающим адрес через канал, используя Addr() метод:

listening <- l.Addr();
0 голосов
/ 10 июня 2018

Некоторые сетевые протоколы позволяют создавать прослушиватель, который прослушивает случайный адрес.Это обычно используется, когда вы хотите запустить несколько экземпляров вашей службы одновременно, и, таким образом, вы не можете заставить их всех слушать один и тот же адрес.В этих случаях ядро ​​найдет тот, который доступен, и поместит туда ваш слушатель.Но когда у вас есть случайный адрес, вам нужно знать, что это за адрес, чтобы вы могли его рекламировать.

Например, для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...