os и filepath

Тема дорожной карты · Golang

Пакет os — интерфейс стандартной библиотеки Go к базовой операционной системе, предоставляющий функции для файлового I/O, управления процессами, переменных окружения, сигналов и обхода директорий, которые используют каждый Golang-сервис. Основные файловые операции включают os.Open и os.Create для чтения и записи файлов, os.MkdirAll для создания дерева директорий и os.Remove для удаления — все возвращают значения error, которые необходимо явно проверять в идиоматичном Go-коде. Пакет os предоставляет os.Getenv и os.LookupEnv для чтения конфигурации из переменных окружения — стандартный паттерн для twelve-factor Golang-приложений, развёрнутых в Docker или Kubernetes. os.Stdin, os.Stdout и os.Stderr реализуют io.Reader и io.Writer, делая их составляемыми с пакетами io и bufio для создания CLI-инструментов и конвейерно-совместимых Golang-программ. Обработка сигналов через os/signal.NotifyContext или signal.Notify с syscall.SIGTERM и syscall.SIGINT позволяет Golang-сервисам выполнять graceful shutdown — дожидаться завершения HTTP-запросов, закрывать пулы соединений pgx или sqlx и сбрасывать буферы логов Zap перед выходом.

Как это работает

os и filepath знаменита batteries-included: net/http (production-уровневый HTTP клиент + сервер), encoding/json/xml/csv (сериализация), database/sql (интерфейс — в паре с драйвером типа pgx, go-sql-driver/mysql), os + os/exec + io/fs (файлы, процессы), crypto/* (хеширование, шифры, TLS), context (cancellation + значения), time, regexp, text/template / html/template, log/slog (структурированное логирование, 1.21+).

Когда применять

По умолчанию stdlib — большинство, к чему тянутся в npm/pip других языков, уже в Go-stdlib. log/slog — для нового логирования (заменяет log + logrus + zap для большинства нужд). net/http-сервер напрямую — пока реально не нужен фреймворк. database/sql + драйвер — вместо ORM, кроме случая многих тривиальных CRUD-эндпойнтов.

Типичные ошибки

Ловушки os и filepath: свой HTTP-роутинг вместо net/http.ServeMux (route patterns в 1.22 — достаточно для многих приложений); игнор http.Server.ReadTimeout и WriteTimeout (slowloris / hung-connection уязвимости); time.Now() прямо в тестах (мок через интерфейс или clockwork); json.Marshal неэкспортированных полей struct (тихо ноль — пишите с заглавной или используйте json:"...").

Связанные понятия

Полезные ресурсы