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