Функции пакета net языка Go
Categories:
func JoinHostPort
func JoinHostPort(host, port string) string
JoinHostPort объединяет хост и порт в сетевой адрес вида «хост:порт». Если хост содержит двоеточие, как в буквенных IPv6-адресах, то JoinHostPort возвращает «[хост]:порт».
Описание параметров хоста и порта см. в func Dial.
func LookupAddr
func LookupAddr(addr string) (names []string, err error)
LookupAddr выполняет обратный поиск по заданному адресу, возвращая список имен, сопоставленных с этим адресом.
Возвращаемые имена проверяются на правильность форматирования доменных имен в формате представления. Если в ответе содержатся недопустимые имена, эти записи отфильтровываются, и вместе с оставшимися результатами, если таковые имеются, возвращается ошибка.
При использовании хост-резольвера библиотеки C будет возвращено не более одного результата. Чтобы обойти хост-резольвер, используйте собственный резольвер.
LookupAddr внутренне использует context.Background; чтобы указать контекст, используйте Resolver.LookupAddr.
func LookupCNAME
func LookupCNAME(host string) (cname string, err error)
LookupCNAME возвращает каноническое имя для заданного хоста. Те, кому не важно каноническое имя, могут вызвать LookupHost или LookupIP напрямую; оба они позаботятся о разрешении канонического имени в процессе поиска.
Каноническое имя - это конечное имя после следования нуля или более записей CNAME. LookupCNAME не возвращает ошибку, если хост не содержит записей DNS «CNAME», при условии, что хост разрешается в адресные записи.
Возвращаемое каноническое имя проверяется на то, что оно является правильно отформатированным доменным именем формата представления.
LookupCNAME внутренне использует context.Background; чтобы указать контекст, используйте Resolver.LookupCNAME.
func LookupHost
func LookupHost(host string) (addrs []string, err error)
LookupHost ищет заданный хост с помощью локального резольвера. Он возвращает фрагмент адресов этого хоста.
Внутри LookupHost используется context.Background; чтобы указать контекст, используйте Resolver.LookupHost.
func LookupPort
func LookupPort(network, service string) (port int, err error)
LookupPort ищет порт для заданной сети и сервиса.
Внутри LookupPort используется context.Background; чтобы указать контекст, используйте Resolver.LookupPort.
func LookupTXT
func LookupTXT(name string) ([]string, error)
LookupTXT возвращает записи DNS TXT для заданного доменного имени.
Если DNS TXT-запись содержит несколько строк, они объединяются в одну строку.
Внутри LookupTXT используется context.Background; чтобы указать контекст, используйте Resolver.LookupTXT.
func ParseCIDR
func ParseCIDR(s string) (IP, *IPNet, error)
ParseCIDR анализирует s как IP-адрес в нотации CIDR и длину префикса, например «192.0.2.0/24» или «2001:db8::/32», как определено в RFC 4632 и RFC 4291.
Он возвращает IP-адрес и сеть, подразумеваемую IP-адресом и длиной префикса. Например, ParseCIDR(«192.0.2.1/24») возвращает IP-адрес 192.0.2.1 и сеть 192.0.2.0/24.
Пример
package main
import (
"fmt"
"log"
"net"
)
func main() {
ipv4Addr, ipv4Net, err := net.ParseCIDR("192.0.2.1/24")
if err != nil {
log.Fatal(err)
}
fmt.Println(ipv4Addr)
fmt.Println(ipv4Net)
ipv6Addr, ipv6Net, err := net.ParseCIDR("2001:db8:a0b:12f0::1/32")
if err != nil {
log.Fatal(err)
}
fmt.Println(ipv6Addr)
fmt.Println(ipv6Net)
}
Output:
192.0.2.1
192.0.2.0/24
2001:db8:a0b:12f0::1
2001:db8::/32
func Pipe ¶
func Pipe() (Conn, Conn)
Pipe создает синхронное, в памяти, полнодуплексное сетевое соединение; оба конца реализуют интерфейс Conn. Чтение на одном конце совпадает с записью на другом, копируя данные непосредственно между ними; внутренней буферизации нет.
Объяснение Pipe
Функция Pipe
из пакета net
в языке Go позволяет создать синхронный in-memory канал между двумя сетевыми соединениями. Она возвращает два Conn
(интерфейсы соединения), где запись в одно соединение сразу же становится доступной для чтения из другого, и наоборот.
Практическое значение net.Pipe()
Эта функция полезна в тестировании и имитации сетевых взаимодействий без реального использования сети (TCP/IP, Unix-сокетов и т. д.).
Примеры использования
1. Тестирование сетевого клиента и сервера без реального соединения
Допустим, у вас есть клиент и сервер, которые обмениваются данными по сети. Вместо запуска реального сервера в тестах можно использовать net.Pipe()
.
package main
import (
"io"
"net"
"testing"
)
// Серверная логика (обрабатывает соединение)
func handleConn(conn net.Conn) {
defer conn.Close()
_, _ = conn.Write([]byte("Hello, client!"))
}
// Клиентская логика (читает данные)
func readFromServer(conn net.Conn) string {
buf := make([]byte, 1024)
n, _ := conn.Read(buf)
return string(buf[:n])
}
func TestClientServer(t *testing.T) {
// Создаём "виртуальное" соединение
clientConn, serverConn := net.Pipe()
// Запускаем сервер в горутине
go handleConn(serverConn)
// Клиент читает ответ
response := readFromServer(clientConn)
if response != "Hello, client!" {
t.Errorf("Expected 'Hello, client!', got '%s'", response)
} else {
t.Log("Test passed!")
}
}
Что происходит:
net.Pipe()
создаёт два конца соединения.- Сервер пишет в
serverConn
, клиент читает изclientConn
. - Всё происходит в памяти, без реального сетевого взаимодействия.
2. Мокирование сетевых вызовов в unit-тестах
Если ваш код зависит от внешнего API или базы данных, можно подменить реальное соединение моком через net.Pipe()
.
func TestDatabaseClient(t *testing.T) {
clientConn, mockServerConn := net.Pipe()
// Эмуляция сервера БД
go func() {
defer mockServerConn.Close()
request := make([]byte, 1024)
n, _ := mockServerConn.Read(request)
if string(request[:n]) == "GET user:123" {
_, _ = mockServerConn.Write([]byte(`{"id": "123", "name": "Alice"}`))
}
}()
// Клиентский код
_, _ = clientConn.Write([]byte("GET user:123"))
response := make([]byte, 1024)
n, _ := clientConn.Read(response)
expected := `{"id": "123", "name": "Alice"}`
if string(response[:n]) != expected {
t.Errorf("Expected '%s', got '%s'", expected, string(response[:n]))
}
}
Что происходит:
- Клиент отправляет запрос в
clientConn
. - “Сервер” (горутина) читает запрос и возвращает моковый ответ.
- Тест проверяет, что клиент корректно обрабатывает ответ.
Преимущества net.Pipe()
✅ Не требует реального сетевого соединения – работает в памяти.
✅ Синхронная работа – запись блокируется, пока кто-то не прочитает данные.
✅ Удобно для тестирования – не нужно поднимать TCP-сервер или использовать mock-библиотеки.
Ограничения
❌ Только для локального использования – нельзя заменить реальный сетевой обмен в продакшене.
❌ Блокирующие операции – если одна сторона не читает данные, вторая заблокируется при записи.
Вывод
net.Pipe()
– это мощный инструмент для тестирования сетевого кода в Go без реальных соединений. Он особенно полезен в unit-тестах, где важна изоляция и скорость выполнения.
func SplitHostPort
func SplitHostPort(hostport string) (host, port string, err error)
SplitHostPort разделяет сетевой адрес вида «host:port», «host%zone:port», «[host]:port» или «[host%zone]:port» на host или host%zone и port.
Буквальный IPv6-адрес в hostport должен быть заключен в квадратные скобки, как в «[::1]:80», «[::1%lo0]:80».
Описание параметра hostport, а также результатов хоста и порта см. в разделе func Dial.