Назначение пакетов net и net/http
В языке Go пакеты
net
и net/http
тесно связаны, но имеют разные уровни абстракции и предназначены для разных задач.1. Пакет net
Для чего используется:
- Предоставляет низкоуровневые сетевые примитивы для работы с различными сетевыми протоколами (TCP, UDP, IP, Unix-сокеты, DNS и др.).
- Позволяет создавать серверы и клиенты на уровне сокетов.
- Используется, когда нужен полный контроль над сетевым взаимодействием.
Основные возможности:
- Работа с TCP (
net.TCPConn
,net.ListenTCP
) - Работа с UDP (
net.UDPConn
) - Разрешение DNS (
net.LookupHost
,net.ResolveIP
) - Управление сетевыми интерфейсами (
net.Interface
)
Пример TCP-сервера:
package main
import (
"net"
)
func main() {
ln, _ := net.Listen("tcp", ":8080")
for {
conn, _ := ln.Accept()
go func(c net.Conn) {
c.Write([]byte("Hello from TCP server\n"))
c.Close()
}(conn)
}
}
2. Пакет net/http
Для чего используется:
- Реализует высокоуровневый HTTP-стек (клиент и сервер).
- Подходит для создания веб-серверов, REST API, работы с HTTP-запросами.
- Включает роутинг, middleware, куки, сессии и другие HTTP-специфичные функции.
Основные возможности:
- HTTP-сервер (
http.Server
,http.HandleFunc
) - HTTP-клиент (
http.Client
,http.Get
,http.Post
) - Работа с заголовками, куками, формами
- Поддержка HTTPS (через
http.ListenAndServeTLS
)
Пример HTTP-сервера:
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello from HTTP server"))
})
http.ListenAndServe(":8080", nil)
}
Ключевые отличия
Критерий | net |
net/http |
---|---|---|
Уровень | Низкоуровневый (TCP, UDP, IP) | Высокоуровневый (HTTP/HTTPS) |
Использование | Сокеты, DNS, RAW-соединения | Веб-серверы, API, HTTP-клиенты |
Сложность | Требует больше кода | Упрощает HTTP-взаимодействие |
Примеры | Чат-сервер, DNS-резолвер | Веб-сайт, RESTful API |
Когда что использовать?
net
– если нужен контроль над сетевым уровнем (например, пишете свой протокол поверх TCP/UDP).net/http
– для стандартных HTTP-задач (веб-сервисы, API, скачивание данных).
Иногда их комбинируют: например, net/http
использует net
под капотом для работы с TCP-соединениями.