Справочник

Стандартная библиотека — справочник

Обзор API по пакетам: strings, bytes, strconv, fmt, io, os, time, encoding/json, net/http, log/slog, slices, maps, embed.

Все справочники

Собрано из документации пакетов на pkg.go.dev и release notes Go 1.20–1.27. Версия — Go 1.27. Лист даёт карту API; устройство сервиса — в «HTTP-сервисе», работа с базой — в «SQL и Postgres».

1. strings и bytes

Пакеты strings и bytes повторяют друг друга: первый работает со строками, второй — с []byte. Строки неизменяемы, поэтому функции возвращают новые значения; bytes дополнительно даёт буфер, который можно менять.

ЗадачаФункции
поискContains, ContainsAny, ContainsRune, ContainsFunc, Count, Index, IndexAny, IndexByte, IndexFunc, IndexRune, LastIndex, LastIndexAny, LastIndexByte, LastIndexFunc
префикс и суффиксHasPrefix, HasSuffix, TrimPrefix, TrimSuffix
разрезаниеCut, CutLast [1.27], CutPrefix, CutSuffix, Split, SplitN, SplitAfter, SplitAfterN
поляFields, FieldsFunc
итераторы [1.24]Lines, SplitSeq, SplitAfterSeq, FieldsSeq, FieldsFuncSeq
сборкаJoin, Repeat, Builder, NewReplacer
заменаReplace, ReplaceAll, Map
регистр и обрезкаToLower, ToUpper, ToTitle, ToValidUTF8, Trim, TrimLeft, TrimRight, TrimSpace, TrimFunc
сравнениеEqualFold, Compare
s := "key=value"

before, after, ok := strings.Cut(s, "=")
fmt.Println(before, after, ok) // key value true

rest, ok := strings.CutPrefix(s, "key=")
fmt.Println(rest, ok) // value true

for line := range strings.Lines("a\nb\n") {
    fmt.Print(line)
}

Builder собирает строку без квадратичных копирований, Reader даёт io.Reader над строкой, Replacer выполняет несколько замен за один проход. В bytes те же роли играют Buffer и Reader.

var b strings.Builder
b.Grow(32)
b.WriteString("id=")
b.WriteString("42")
s := b.String()

2. strconv

ПреобразованиеФункции
целое ↔ строкаAtoi, Itoa
целое с основаниемParseInt, ParseUint, FormatInt, FormatUint
дробноеParseFloat, FormatFloat
логическоеParseBool, FormatBool
кавычкиQuote, QuoteToASCII, Unquote, UnquoteChar
дописывание в срезAppendInt, AppendUint, AppendFloat, AppendBool, AppendQuote

ParseInt(s, base, bitSize): base от 2 до 36 или 0 — тогда основание определяется по префиксу (0x, 0o, 0b). bitSize ограничивает результат: 0 — int, 8/16/32/64 — соответствующий размер. FormatFloat принимает формат 'f', 'e', 'E', 'g', 'G', 'x'.

n, err := strconv.Atoi("42")
if err != nil {
    return err
}

hex := strconv.FormatInt(int64(n), 16) // "2a"
f, _ := strconv.ParseFloat("3.14", 64)
s := strconv.FormatFloat(f, 'f', 2, 64) // "3.14"

3. fmt

ГлаголЧто печатает
%vзначение в формате по умолчанию
%+vструктуру с именами полей
%#vGo-синтаксис значения
%Tтип значения
%pадрес указателя
%tbool
%d, %b, %o, %O, %x, %Xцелое в десятичном, двоичном, восьмеричном, восьмеричном с 0o, шестнадцатеричном
%c, %q, %Uсимвол, строка в кавычках, код Unicode
%sстрока или []byte
%f, %e, %E, %g, %Gдробное в разных нотациях
%wобёртка ошибки для Errorf
%%литеральный процент

Флаги: + — знак или имена полей, - — выравнивание влево, # — альтернативная форма, 0 — ведущие нули, пробел — пробел вместо плюса. Ширина и точность задаются как %8.2f или через *.

type User struct {
    ID   int
    Name string
}

u := User{ID: 7, Name: "Аня"}
fmt.Printf("%v\n", u)   // {7 Аня}
fmt.Printf("%+v\n", u)  // {ID:7 Name:Аня}
fmt.Printf("%#v\n", u)  // main.User{ID:7, Name:"Аня"}
fmt.Printf("%08d\n", 42) // 00000042

Семейства: Print/Printf/Println пишут в стандартный вывод, Sprint* возвращают строку, Fprint* пишут в io.Writer, Errorf создаёт ошибку, Scan* читают ввод.

4. io, io/fs, bufio

io задаёт интерфейсы потоков. Чем меньше интерфейс, тем легче его реализовать и подменить в тестах.

ИнтерфейсМетоды
io.ReaderRead(p []byte) (n int, err error)
io.WriterWrite(p []byte) (n int, err error)
io.CloserClose() error
io.SeekerSeek(offset int64, whence int) (int64, error)
io.ReaderAtReadAt(p []byte, off int64) (n int, err error)
io.WriterAtWriteAt(p []byte, off int64) (n int, err error)
io.ReaderFromReadFrom(r Reader) (n int64, err error)
io.WriterToWriteTo(w Writer) (n int64, err error)
io.ByteReaderReadByte() (byte, error)
io.RuneReaderReadRune() (r rune, size int, err error)
ФункцияЧто делает
io.Copy, io.CopyN, io.CopyBufferкопирует поток; использует WriterTo/ReaderFrom, если они есть
io.ReadAll, io.ReadFullчитает всё или ровно буфер
io.LimitReaderограничивает число читаемых байт
io.TeeReaderчитает и одновременно пишет копию в Writer
io.MultiReader, io.MultiWriterсклеивает несколько потоков
io.Pipeсинхронная труба в памяти
io.Discard, io.NopCloserпустой приёмник и обёртка без Close

Ошибки: io.EOF — штатный конец потока; io.ErrUnexpectedEOF — поток кончился раньше, чем ожидалось; io.ErrShortWrite — записано меньше, чем просили.

io/fs — абстракция файловой системы: fs.FS, fs.File, fs.DirEntry, fs.FileInfo. Функции fs.ReadFile, fs.ReadDir, fs.WalkDir, fs.Glob, fs.Sub, fs.ValidPath. Обход останавливают fs.SkipDir и fs.SkipAll.

bufio добавляет буфер: Reader с ReadString, ReadBytes, Peek, Scanner с Scan/Text/Bytes и функциями разбиения ScanLines, ScanWords, ScanRunes, ScanBytes.

f, err := os.Open("data.txt")
if err != nil {
    return err
}
defer f.Close()

sc := bufio.NewScanner(f)
sc.Buffer(make([]byte, 64*1024), 1024*1024)
for sc.Scan() {
    fmt.Println(sc.Text())
}
if err := sc.Err(); err != nil {
    return err
}

5. os, os/exec, path/filepath

ЗадачаФункции os
файлыOpen, Create, ReadFile, WriteFile, Remove, Rename
каталогиMkdir, MkdirAll, ReadDir, RemoveAll
метаданныеStat, Lstat, Chmod, Chown, SameFile
окружениеGetenv, LookupEnv, Setenv, Unsetenv, Environ, Args, Exit
потокиStdin, Stdout, Stderr
проверка ошибокIsNotExist, IsExist, IsPermission, IsTimeout
безопасный доступ [1.24]OpenRoot, тип os.Root
копирование дерева [1.23]CopyFS

os.Root ограничивает операции каталогом: пути, ведущие наружу, включая символические ссылки, запрещены. Это защита от обхода каталога, когда часть пути приходит извне.

root, err := os.OpenRoot("/srv/uploads")
if err != nil {
    return err
}
defer root.Close()

f, err := root.Open("report.txt") // только внутри /srv/uploads
if err != nil {
    return err
}
defer f.Close()

os/exec запускает процессы: Command, CommandContext, Run, Output, CombinedOutput, StdoutPipe/StdinPipe, Start/Wait. Ошибку ненулевого кода возвращает *exec.ExitError; exec.LookPath ищет исполняемый файл в PATH.

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

cmd := exec.CommandContext(ctx, "git", "rev-parse", "HEAD")
out, err := cmd.Output()
if err != nil {
    return fmt.Errorf("git: %w", err)
}
fmt.Println(strings.TrimSpace(string(out)))

path/filepath работает с путями текущей ОС: Join, Clean, Abs, Base, Dir, Ext, Rel, Match, Glob, WalkDir, EvalSymlinks, ToSlash/FromSlash, Separator. Для URL-путей есть отдельный path.

6. time

time.Time — момент времени с часовым поясом; time.Duration — длительность в наносекундах. Now несёт монотонное показание, поэтому Sub и сравнения не зависят от перевода системных часов; форматирование монотонную часть отбрасывает.

ЗадачаAPI
текущее времяNow, Since, Until
из UnixUnix, UnixMilli, UnixMicro, UnixNano
арифметикаAdd, AddDate, Sub
сравнениеBefore, After, Equal, Compare [1.20]
округлениеTruncate, Round
форматFormat, Parse, ParseInLocation
поясLoadLocation, FixedZone, In
таймерыNewTimer, NewTicker, After, AfterFunc, Sleep

Раскладка задаётся эталонным временем Mon Jan 2 15:04:05 MST 2006. Готовые константы: ANSIC, UnixDate, RFC822, RFC822Z, RFC850, RFC1123, RFC1123Z, RFC3339, RFC3339Nano, Kitchen, Stamp, StampMilli, StampMicro, StampNano, DateTime [1.20], DateOnly [1.20], TimeOnly [1.20].

t, err := time.Parse(time.RFC3339, "2026-11-04T10:30:00Z")
if err != nil {
    return err
}

fmt.Println(t.Format(time.DateOnly)) // 2026-11-04

ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    break
}

time.After в цикле создаёт новый таймер на каждой итерации; NewTimer с Reset переиспользует один. Ticker и Timer нужно останавливать, иначе они живут до срабатывания.

7. encoding/json

APIЧто делает
json.Marshal, MarshalIndentзначение → JSON
json.UnmarshalJSON → значение
json.NewEncoderпотоковая запись в io.Writer
json.NewDecoderпотоковое чтение из io.Reader
json.RawMessageотложенный разбор вложенного JSON
json.Numberчисло без потери точности
json.Marshaler, Unmarshalerсвоё представление типа

Теги полей: json:"name", json:"-" — исключить, omitempty — пропустить пустое, omitzero [1.24] — пропустить нулевое (в том числе нулевой time.Time), string — закодировать число или bool строкой.

type User struct {
    ID        int       `json:"id"`
    Name      string    `json:"name"`
    Email     string    `json:"email,omitempty"`
    CreatedAt time.Time `json:"created_at,omitzero"`
}

data, err := json.Marshal(User{ID: 1, Name: "Аня"})
if err != nil {
    return err
}
fmt.Println(string(data)) // {"id":1,"name":"Аня"}

Decoder.DisallowUnknownFields запрещает лишние поля, UseNumber сохраняет числа как json.Number, More и Token позволяют читать поток токенов. Encoder.SetEscapeHTML(false) отключает экранирование <, > и &; по умолчанию оно включено.

dec := json.NewDecoder(r.Body)
dec.DisallowUnknownFields()

var req CreateUser
if err := dec.Decode(&req); err != nil {
    return fmt.Errorf("decode: %w", err)
}

8. net/http

Пакет даёт и клиент, и сервер. Устройство запроса, middleware, таймауты и завершение разобраны в листе «HTTP-сервис»; здесь — карта API.

СторонаAPI
клиентClient, Get, Post, PostForm, Head, NewRequest, NewRequestWithContext, Do
запросRequest: Method, URL, Header, Body, Context, PathValue
ответResponse: StatusCode, Header, Body; Body нужно закрывать
маршрутизацияServeMux, Handler, HandlerFunc, NotFound
серверServer, ListenAndServe, Shutdown, Close
ответ обработчикаResponseWriter, Flusher, Hijacker, NewResponseController [1.20]
тестыhttptest.NewRecorder, httptest.NewServer, httptest.NewRequest
CSRF [1.25]CrossOriginProtection

С Go 1.22 шаблоны ServeMux принимают метод и подстановки: "GET /users/{id}", значение — r.PathValue("id"). Шаблон с методом приоритетнее шаблона без метода; {$} требует точного совпадения пути.

mux := http.NewServeMux()
mux.HandleFunc("GET /users/{id}", func(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")
    fmt.Fprintf(w, "user %s", id)
})

srv := &http.Server{
    Addr:              ":8080",
    Handler:           mux,
    ReadHeaderTimeout: 5 * time.Second,
}
log.Fatal(srv.ListenAndServe())

Клиент без таймаута может ждать вечно; таймаут задают на Client или через контекст запроса. Transport переиспользует соединения, поэтому создавать новый Client на каждый запрос не нужно.

client := &http.Client{Timeout: 5 * time.Second}

req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
    return err
}

resp, err := client.Do(req)
if err != nil {
    return err
}
defer resp.Body.Close()

9. log/slog

log/slog (Go 1.21) — структурное логирование: запись состоит из сообщения и набора пар «ключ — значение». Обработчик (Handler) решает, в каком формате и куда писать.

APIЧто делает
slog.Newлоггер с заданным обработчиком
NewTextHandler, NewJSONHandlerтекстовый и JSON-формат
HandlerOptionsLevel, AddSource, ReplaceAttr
Debug, Info, Warn, Errorуровни; Log и LogAttrs — с явным уровнем
With, WithGroupпостоянные атрибуты и вложенная группа
String, Int, Int64, Float64, Bool, Time, Duration, Any, Groupпостроение Attr
LevelVarуровень, который можно менять во время работы
LogValuerсвоё представление значения в логе
SetDefaultлоггер по умолчанию для пакетных функций
var level slog.LevelVar
level.Set(slog.LevelInfo)

h := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
    Level:     &level,
    AddSource: true,
})
log := slog.New(h).With("service", "billing")

log.Info("started", "addr", ":8080")
log.Error("request failed", "err", err, "user_id", 42)

Уровни: Debug, Info, Warn, Error. Контекстные варианты InfoContext и подобные передают context.Context обработчику, который может достать из него трассировку или идентификатор запроса.

10. slices, maps, cmp, sort

Пакеты slices и maps (Go 1.21) — обобщённые операции над срезами и мапами. С Go 1.23 часть функций возвращает итераторы iter.Seq, которые работают в for range.

ПакетФункции
slicesEqual, EqualFunc, Compare, CompareFunc, Index, IndexFunc, Contains, ContainsFunc, Insert, Delete, DeleteFunc, Replace, Clone, Compact, CompactFunc, Grow, Clip, Reverse, Concat, Repeat
slices: сортировкаSort, SortFunc, SortStableFunc, IsSorted, IsSortedFunc, Min, MinFunc, Max, MaxFunc, BinarySearch, BinarySearchFunc
slices: итераторыAll, Backward, Values, AppendSeq, Collect, Sorted, SortedFunc, SortedStableFunc, Chunk
mapsEqual, EqualFunc, Clone, Copy, DeleteFunc
maps: итераторыAll, Keys, Values, Insert, Collect
cmpCompare, Less, Or; ограничение cmp.Ordered
sortInts, Strings, Slice, SliceStable, Search, SearchInts
nums := []int{3, 1, 2}
slices.Sort(nums)                 // [1 2 3]
fmt.Println(slices.Contains(nums, 2))

people := []Person{{"Аня", 30}, {"Борис", 25}}
slices.SortFunc(people, func(a, b Person) int {
    return cmp.Compare(a.Age, b.Age)
})

m := map[string]int{"b": 2, "a": 1}
keys := slices.Sorted(maps.Keys(m)) // [a b]

sort.Slice принимает функцию сравнения по индексам и работает через отражение; для типизированных срезов slices.SortFunc быстрее и безопаснее по типам.

11. embed

Директива //go:embed встраивает файлы в бинарник. Переменная может быть string, []byte или embed.FS; для каталога — только embed.FS.

ШаблонЧто встраивает
//go:embed hello.txtодин файл
//go:embed static/*файлы каталога без вложенных каталогов
//go:embed staticвесь каталог рекурсивно
//go:embed all:staticкаталог, включая файлы, начинающиеся с . или _

Шаблон не может содержать ., .. или начинаться с /. Файлы, начинающиеся с . или _, по умолчанию пропускаются — их включает префикс all:.

import "embed"

//go:embed static
var static embed.FS

func main() {
    sub, err := fs.Sub(static, "static")
    if err != nil {
        log.Fatal(err)
    }
    http.Handle("/", http.FileServer(http.FS(sub)))
    log.Fatal(http.ListenAndServe(":8080", nil))
}

embed.FS реализует fs.FS, поэтому его можно отдать в http.FS, template.ParseFS или fs.WalkDir.

12. Первоисточники