Стандартная библиотека Go
| Язык | Go |
|---|---|
| Документация | pkg.go.dev/std |
| Совместимость | обещание Go 1 (с 2012 года) |
| Ключевые пакеты | net/http, encoding/json, context, io, os, sync, time, crypto |
| Дополнительные пакеты | golang.org/x/... (вне гарантий Go 1) |
| Особенность | сетевой сервер без сторонних зависимостей |
Стандартная библиотека Go — набор из более чем 150 пакетов, поставляемых вместе с компилятором Go. Она известна тем, что покрывает почти всё необходимое для сетевых сервисов и утилит командной строки: HTTP-сервер и клиент, TLS, JSON, криптографию, работу с файлами, конкурентность, тестирование и профилирование. Многие Go-проекты обходятся вообще без внешних зависимостей или с минимумом их.[1]
Принципы
- Обещание совместимости Go 1 (2012): код, написанный для Go 1.x, продолжает компилироваться и работать на всех следующих версиях 1.y.[2] Поэтому API стандартной библиотеки меняется осторожно: новые возможности добавляются, старые почти не удаляются.
- Небольшие интерфейсы:
io.Readerиio.Writerс одним методом связывают файлы, сетевые соединения, сжатие, шифрование и буферы в цепочки. - Пакеты
golang.org/x/...— экспериментальные или узкоспециальные расширения (x/crypto,x/net,x/sync,x/tools) вне гарантий совместимости; удачные идеи потом переходят в стандартную библиотеку.
Обзор пакетов
| Область | Пакеты |
|---|---|
| Ввод-вывод | io, bufio, os, io/fs, path/filepath, embed |
| Строки и текст | strings, strconv, bytes, unicode/utf8, regexp, text/template, html/template |
| Сеть | net, net/http, net/url, net/netip, crypto/tls |
| Форматы | encoding/json, encoding/csv, encoding/xml, encoding/base64, archive/zip, compress/gzip |
| Конкурентность | sync, sync/atomic, context, time |
| Криптография | crypto/sha256, crypto/rand, crypto/aes, crypto/ed25519, crypto/mlkem |
| Коллекции | slices, maps, sort, container/heap, iter |
| Данные | database/sql (общий интерфейс к драйверам) |
| Диагностика | log, log/slog, runtime/pprof, net/http/pprof, expvar |
| Тесты | testing, net/http/httptest, testing/fstest |
| CLI | flag, os/exec, os/signal |
Пакеты slices и maps появились в Go 1.21 благодаря дженерикам, а iter — в Go 1.23 вместе с итераторами по функциям.
HTTP-сервер
Пакет net/http даёт готовый к продакшену сервер с поддержкой HTTP/1.1, HTTP/2 и TLS.[3] С Go 1.22 встроенный маршрутизатор ServeMux понимает методы и параметры пути, что для многих сервисов сделало сторонние роутеры необязательными:[4]
package main
import (
"encoding/json"
"log/slog"
"net/http"
"time"
)
type Item struct {
ID string `json:"id"`
Name string `json:"name"`
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /items/{id}", func(w http.ResponseWriter, r *http.Request) {
item := Item{ID: r.PathValue("id"), Name: "пример"}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(item)
})
srv := &http.Server{
Addr: ":8080",
Handler: mux,
ReadHeaderTimeout: 5 * time.Second,
}
slog.Info("listening", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != nil {
slog.Error("server stopped", "err", err)
}
}
Каждый запрос обрабатывается в отдельной горутине. Тайм-ауты стоит задавать явно: у http.Server и http.Client по умолчанию их нет.
context
Пакет context передаёт по цепочке вызовов сроки выполнения, отмену и значения уровня запроса.[6] Первым аргументом функции, которая может долго работать, принято передавать ctx context.Context:
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", "https://api.example.com", nil)
resp, err := http.DefaultClient.Do(req)
Если клиент закрыл соединение или истёк тайм-аут, отмена распространяется на запросы к базе и внешним API.
JSON
encoding/json преобразует структуры в JSON и обратно с помощью тегов полей (json:"name,omitempty").[7] Пакет работает через рефлексию и не самый быстрый, поэтому для высоконагруженных сервисов существуют сторонние альтернативы; в Go 1.25 появился экспериментальный encoding/json/v2. Ошибки разбора возвращаются как обычные значения (см. Обработка ошибок в Go).
Логирование: slog
С Go 1.21 есть пакет log/slog для структурированных логов с уровнями и обработчиками текстового и JSON-формата — его удобно отправлять в системы сбора логов (см. Логирование и трассировка (OpenTelemetry)).[5]
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("order created", "order_id", 42, "user", "ivan")
// {"time":"...","level":"INFO","msg":"order created","order_id":42,"user":"ivan"}
Тестирование и профилирование
Пакет testing вместе с командой go test поддерживает модульные тесты, табличные тесты, бенчмарки, фаззинг (с Go 1.18) и примеры, которые проверяются и попадают в документацию; httptest позволяет тестировать HTTP-обработчики без сети (см. Тестирование в Go). Профилировщик pprof показывает, где программа тратит процессор и память, а детектор гонок -race находит гонки данных.
Чего нет
В стандартной библиотеке нет драйверов конкретных СУБД (только интерфейс database/sql, драйверы вроде pgx для PostgreSQL ставятся отдельно), ORM, GUI, полноценного веб-фреймворка, а также YAML и gRPC. Их подключают как модули.