Интерфейс net.Addr

Интерфейс net.Addr представляет собой сетевой адрес в Go. Он используется для получения информации о типе сети и строковом представлении адреса для сетевых соединений, слушателей и других сетевых сущностей. Этот интерфейс реализуется такими типами, как net.TCPAddr, net.UDPAddr и net.IPAddr.

Интерфейс net.Addr содержит два метода: Network, который возвращает тип сети (например, "tcp", "udp" или "ip"), и String, который возвращает строковое представление адреса (например, "192.168.1.1:8080" или "[::1]:80").

Синтаксис

gotype Addr interface {
  Network() string
  String() string
}

Пример

Давайте создадим TCP-адрес с использованием net.ResolveTCPAddr и вызовем методы интерфейса net.Addr:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  addr, err := net.ResolveTCPAddr("tcp", "192.168.1.1:8080")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("Network:", addr.Network())
  fmt.Println("String:", addr.String())
}

Результат выполнения кода:

go"Network: tcp"
"String: 192.168.1.1:8080"

Пример

Давайте получим адрес клиента из активного соединения, используя метод RemoteAddr, который возвращает интерфейс net.Addr:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  listener, err := net.Listen("tcp", "127.0.0.1:0")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer listener.Close()

  go func() {
    conn, err := net.Dial("tcp", listener.Addr().String())
    if err == nil {
      conn.Close()
    }
  }()

  conn, err := listener.Accept()
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer conn.Close()

  remoteAddr := conn.RemoteAddr()
  fmt.Println("Network:", remoteAddr.Network())
  fmt.Println("String:", remoteAddr.String())
}

Результат выполнения кода:

go"Network: tcp"
"String: 127.0.0.1:XXXXX"

Обратите внимание, что реальный порт будет динамическим, поэтому вместо XXXXX будет конкретный номер порта.

Пример

Давайте сравним строковые представления адресов для разных типов сетей:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  addrs := []struct {
    network string
    address string
  }{
    {"tcp", "192.168.1.1:8080"},
    {"udp", "10.0.0.1:53"},
    {"tcp", "[::1]:80"},
  }

  for _, a := range addrs {
    addr, err := net.ResolveTCPAddr(a.network, a.address)
    if err != nil {
      fmt.Println("Error:", err)
      continue
    }

    fmt.Printf("Network: %s, String: %s\n",
      addr.Network(), addr.String())
  }
}

Результат выполнения кода:

go"Network: tcp, String: 192.168.1.1:8080"
"Network: udp, String: 10.0.0.1:53"
"Network: tcp, String: [::1]:80"

Смотрите также

  • интерфейс net.Conn,
    который предоставляет методы для работы с сетевым соединением
  • интерфейс net.Listener,
    который используется для прослушивания входящих соединений
  • тип net.TCPAddr,
    который реализует интерфейс net.Addr для TCP-адресов
  • тип net.UDPAddr,
    который реализует интерфейс net.Addr для UDP-адресов