Интерфейс 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").
Синтаксис
type Addr interface {
Network() string
String() string
}
Пример
Давайте создадим TCP-адрес с использованием net.ResolveTCPAddr
и вызовем методы интерфейса net.Addr:
package 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())
}
Результат выполнения кода:
"Network: tcp"
"String: 192.168.1.1:8080"
Пример
Давайте получим адрес клиента из активного соединения,
используя метод RemoteAddr, который возвращает
интерфейс net.Addr:
package 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())
}
Результат выполнения кода:
"Network: tcp"
"String: 127.0.0.1:XXXXX"
Обратите внимание, что реальный порт будет динамическим,
поэтому вместо XXXXX будет конкретный номер порта.
Пример
Давайте сравним строковые представления адресов для разных типов сетей:
package 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())
}
}
Результат выполнения кода:
"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-адресов