# Стандартная библиотека Go

> Набор пакетов, поставляемых с Go, — HTTP-сервер и клиент, JSON, криптография, конкурентность, тестирование, логирование; на нём без внешних зависимостей пишут полноценные сетевые сервисы.

Источник: https://llmdocs.ru/wiki/go-stdlib/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Язык**: 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](https://llmdocs.ru/wiki/go.md). Она известна тем, что покрывает почти всё необходимое для сетевых сервисов и утилит командной строки: HTTP-сервер и клиент, [TLS](https://llmdocs.ru/wiki/tls.md), [JSON](https://llmdocs.ru/wiki/json.md), криптографию, работу с файлами, конкурентность, тестирование и профилирование. Многие 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 благодаря [дженерикам](https://llmdocs.ru/wiki/go-generics.md), а `iter` — в Go 1.23 вместе с итераторами по функциям.

## HTTP-сервер

Пакет `net/http` даёт готовый к продакшену сервер с поддержкой HTTP/1.1, [HTTP/2](https://llmdocs.ru/wiki/http2-http3.md) и TLS.[3] С Go 1.22 встроенный маршрутизатор `ServeMux` понимает методы и параметры пути, что для многих сервисов сделало сторонние роутеры необязательными:[4]

```go
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)
    }
}
```

Каждый запрос обрабатывается в отдельной [горутине](https://llmdocs.ru/wiki/goroutines-channels.md). Тайм-ауты стоит задавать явно: у `http.Server` и `http.Client` по умолчанию их нет.

## context

Пакет `context` передаёт по цепочке вызовов сроки выполнения, отмену и значения уровня запроса.[6] Первым аргументом функции, которая может долго работать, принято передавать `ctx context.Context`:

```go
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](https://llmdocs.ru/wiki/go-errors.md)).

## Логирование: slog

С Go 1.21 есть пакет `log/slog` для структурированных логов с уровнями и обработчиками текстового и JSON-формата — его удобно отправлять в системы сбора логов (см. [Логирование и трассировка (OpenTelemetry)](https://llmdocs.ru/wiki/opentelemetry.md)).[5]

```go
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](https://llmdocs.ru/wiki/go-testing.md)). Профилировщик `pprof` показывает, где программа тратит процессор и память, а детектор гонок `-race` находит [гонки данных](https://llmdocs.ru/wiki/race-conditions-locks.md).

## Чего нет

В стандартной библиотеке нет драйверов конкретных СУБД (только интерфейс `database/sql`, драйверы вроде pgx для [PostgreSQL](https://llmdocs.ru/wiki/postgresql.md) ставятся отдельно), ORM, GUI, полноценного веб-фреймворка, а также YAML и gRPC. Их подключают как [модули](https://llmdocs.ru/wiki/go-modules.md).

## См. также

- [Go (язык)](https://llmdocs.ru/wiki/go.md)
- [Горутины и каналы](https://llmdocs.ru/wiki/goroutines-channels.md)
- [Обработка ошибок в Go](https://llmdocs.ru/wiki/go-errors.md)
- [Go-модули (go.mod)](https://llmdocs.ru/wiki/go-modules.md)

## Источники

1. [Go — Standard library (pkg.go.dev)](https://pkg.go.dev/std)
2. [Go 1 and the Future of Go Programs (compatibility promise)](https://go.dev/doc/go1compat)
3. [Go — package net/http](https://pkg.go.dev/net/http)
4. [Go Blog — Routing Enhancements for Go 1.22](https://go.dev/blog/routing-enhancements)
5. [Go Blog — Structured Logging with slog](https://go.dev/blog/slog)
6. [Go Blog — Go Concurrency Patterns: Context](https://go.dev/blog/context)
7. [Go — package encoding/json](https://pkg.go.dev/encoding/json)
