Назначение пакетов 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-соединениями.