Avatar ·

Можно ли получить список всех стандартных пакетов Go? Как это сделать?

Всем привет! Я начал изучать Go около месяца назад и пишу свой первый небольшой проект — простой HTTP-сервер с парой эндпоинтов. В процессе я постоянно натыкаюсь на то, что не знаю всех возможностей стандартной библиотеки. Например, я случайно написал свою функцию для работы с JSON, хотя в Go уже есть `encoding/json`. Или потратил час на реализацию парсинга флагов командной строки, пока не узнал про `flag`. Мне стало интересно: а можно ли как-то программно или через CLI получить полный список всех пакетов, которые входят в стандартную библиотеку Go? Я пробовал `go list std`, но он выдает просто список имен, и я не уверен, что это все пакеты. Еще я слышал про `go doc`, но он показывает документацию только по одному пакету за раз. Вот что я уже пробовал: ```go // main.go package main import ( "fmt" "os/exec" ) func main() { cmd := exec.Command("go", "list", "std") out, _ := cmd.Output() fmt.Println(string(out)) } ``` Но этот код работает только из терминала. Может быть, есть способ получить список пакетов прямо внутри программы на Go? Или, может быть, есть какой-то официальный файл или сайт с полным перечнем? Было бы круто иметь такой список под рукой, чтобы не изобретать велосипед каждый раз. Подскажите, пожалуйста, как опытные разработчики решают эту проблему? Заранее спасибо! <<>>

Как получить полный список всех стандартных пакетов Go

Да, вы можете легко получить список всех стандартных пакетов Go. Самый простой и надёжный способ — использовать команду go list std в терминале. Она выводит все пакеты, которые входят в стандартную библиотеку, включая те, что находятся в подпапках (например, net/http, encoding/json).

Но если вам нужно получить этот список программно (внутри вашей Go-программы), есть несколько подходов. Вот самый правильный и рекомендуемый — использовать пакет go/packages из стандартной библиотеки (обратите внимание: это не опечатка, пакет действительно называется go/packages):

package main

import (
    "fmt"
    "go/packages"
    "os"
)

func main() {
    cfg := &packages.Config{
        Mode: packages.NeedName | packages.NeedFiles,
    }

    pkgs, err := packages.Load(cfg, "std")
    if err != nil {
        fmt.Fprintf(os.Stderr, "Ошибка загрузки: %v\n", err)
        os.Exit(1)
    }

    for _, pkg := range pkgs {
        fmt.Println(pkg.PkgPath)
    }
}

Этот код загружает все стандартные пакеты и выводит их пути. Если вам нужно больше информации (например, список файлов, зависимости или экспортируемые имена), просто добавьте соответствующие флаги в Mode:

  • packages.NeedFiles — список Go-файлов в пакете
  • packages.NeedImports — импортируемые пакеты
  • packages.NeedExportsFile — файл с экспортируемыми символами

Если вы хотите просто посмотреть список в терминале, используйте:

go list std | sort

Команда sort не обязательна, но так список выглядит аккуратнее. Вы также можете отфильтровать только пакеты верхнего уровня:

go list std | grep -v '/'

Это покажет только корневые пакеты (например, fmt, net, os), исключая подпакеты (например, net/http).

Важное замечание

Использование os/exec для вызова go list из вашей программы — плохая практика. Это добавляет зависимость от установленного Go и может работать по-разному в разных окружениях. Пакет go/packages решает эту проблему, так как он использует Go-тулчейн напрямую.

Также имейте в виду, что список стандартных пакетов меняется от версии к версии Go. Например, в Go 1.21 добавили пакет log/slog, а в Go 1.22 — math/rand/v2. Поэтому не храните захардкоженный список — всегда получайте его динамически.

Альтернативный способ: go doc --all

Если вам нужно не просто имя пакета, а его документация, используйте:

go doc --all std

Но учтите, что вывод будет очень большим. Лучше сразу перенаправить его в файл:

go doc --all std > std_docs.txt

Этот способ полезен для офлайн-изучения, но не для программного использования.

<<>>

Дополнительный способ: список из Go Playground и официальной документации

Если вам не нужно программно получать список, а просто хочется иметь его под рукой для изучения, вот два простых варианта:

1. Официальный сайт Go

Перейдите на pkg.go.dev/std. Там отображается полный каталог стандартной библиотеки с поиском, примерами и документацией. Это самый удобный способ для человека — можно кликать на пакеты и сразу читать документацию.

2. Создайте свой справочный файл

Выполните в терминале:

go list std > go_std_packages.txt

Теперь у вас есть текстовый файл со всеми пакетами. Вы можете открыть его в любом редакторе и отмечать те, которые уже изучили.

Лично я рекомендую сочетать оба подхода: держать файл со списком для быстрой проверки ("этот пакет стандартный или нет?"), а для глубокого изучения использовать pkg.go.dev. Со временем вы запомните основные пакеты (их около 150), и вопрос "что есть в стандартной библиотеке" отпадёт сам собой.