Написание документации для Go проекта: от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему документация критична для Go проектов

Go (Golang) славится своей простотой и читаемостью, но даже самый элегантный код может остаться невостребованным без качественной документации. Хорошая документация не просто описывает функции — она помогает другим разработчикам быстро понять архитектуру проекта, начать его использовать и вносить изменения. В этой статье мы разберем полный цикл написания документации для Go проекта: от базовых комментариев до генерации интерактивной документации.

Документация в Go имеет особый статус: она встроена в язык через систему godoc. Это значит, что любой разработчик может сгенерировать документацию прямо из исходного кода. Правильно оформленная документация экономит часы поддержки и делает ваш проект профессиональным.

Основы документирования в Go: синтаксис и правила

Комментарии для godoc

В Go документирование начинается с комментариев. Существует два типа комментариев, которые обрабатывает godoc:

  • Однострочные комментарии — начинаются с //. Используются для кратких описаний.
  • Блочные комментарии — заключаются в /* */. Подходят для подробных объяснений.

Основное правило: комментарий должен располагаться непосредственно перед объявлением функции, типа, переменной или пакета. Без пустой строки между комментарием и объявлением.

// Package calculator предоставляет функции для базовых арифметических операций.
package calculator

// Add возвращает сумму двух целых чисел.
// Пример использования:
//
//  sum := Add(3, 5)
//  fmt.Println(sum) // Вывод: 8
func Add(a, b int) int {
    return a + b
}

Комментарий к пакету

Каждый пакет должен иметь комментарий, который начинается со слова "Package", за которым следует имя пакета. Этот комментарий становится описанием пакета на странице документации.

// Package config предоставляет функции для загрузки и валидации конфигураций.
// Поддерживает форматы JSON, YAML и TOML.
package config

Документирование экспортируемых идентификаторов

Все экспортируемые (начинающиеся с заглавной буквы) элементы должны быть задокументированы. Это включает:

  • Функции и методы
  • Типы и структуры
  • Константы и переменные
  • Интерфейсы
// User представляет пользователя системы.
type User struct {
    // ID — уникальный идентификатор пользователя.
    ID int
    // Name — полное имя пользователя.
    Name string
}

// NewUser создает нового пользователя с указанным именем.
// Возвращает ошибку, если имя пустое.
func NewUser(name string) (*User, error) {
    if name == "" {
        return nil, errors.New("имя не может быть пустым")
    }
    return &User{ID: generateID(), Name: name}, nil
}

Лучшие практики написания документации Go

Пишите документацию как историю

Документация должна отвечать на вопросы: "Что делает этот код?", "Как его использовать?" и "Почему он устроен именно так?". Избегайте простого перефразирования кода.

Плохо:

// GetUser возвращает пользователя.
func GetUser(id int) *User

Хорошо:

// GetUser возвращает пользователя по его ID.
// Если пользователь не найден, возвращает nil.
// Выполняет запрос к базе данных с использованием кэша.
func GetUser(id int) *User

Используйте примеры кода

Go поддерживает исполняемые примеры в документации. Они не только показывают использование, но и автоматически тестируются.

// ExampleAdd демонстрирует использование функции Add.
func ExampleAdd() {
    sum := Add(2, 3)
    fmt.Println(sum)
    // Output: 5
}

Примеры должны находиться в файлах с суффиксом _test.go. Функция примера должна начинаться с Example и может содержать имя функции или типа.

Документируйте ошибки и граничные случаи

Указывайте, какие ошибки может возвращать функция, и как обрабатывать особые ситуации.

// Divide выполняет деление двух чисел с плавающей точкой.
// Возвращает ошибку, если divisor равен нулю.
// Пример:
//
//  result, err := Divide(10.0, 2.0)
//  if err != nil {
//      log.Fatal(err)
//  }
//  fmt.Println(result) // 5.0
func Divide(dividend, divisor float64) (float64, error) {
    if divisor == 0 {
        return 0, errors.New("деление на ноль")
    }
    return dividend / divisor, nil
}

Инструменты и генерация документации Go

godoc — встроенный генератор документации

Go поставляется со встроенным инструментом godoc. Он читает комментарии из исходного кода и генерирует HTML-документацию.

Запуск локального сервера документации:

godoc -http=:6060

После запуска откройте браузер по адресу http://localhost:6060. Вы увидите документацию для всех ваших пакетов и стандартной библиотеки.

pkgsite — современная альтернатива

С 2021 года Go рекомендует использовать pkgsite для просмотра документации. Он предлагает улучшенный интерфейс и поддержку тем.

go install golang.org/x/pkgsite/cmd/pkgsite@latest
pkgsite -http=:8080

Автоматическая проверка документации

Используйте линтеры для проверки качества документации:

  • golint — проверяет стиль документации
  • revive — более гибкий линтер с правилами для комментариев
  • doccoverage — проверяет процент документированных экспортируемых элементов
# Установка revive
go install github.com/mgechev/revive@latest

# Проверка документации
revive -config=revive.toml ./...

Продвинутые техники документирования

Документирование интерфейсов

Интерфейсы в Go требуют особого внимания. Документируйте не только сам интерфейс, но и ожидаемое повед

Блоги

Рекомендаций по книгам