Внутренние пакеты и рабочие пространства
internal/, директивы replace и go work
«Внутренние пакеты и рабочие пространства» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Каталог internal/
Пакеты внутри каталога internal/ можно импортировать только из кода в дереве родительского каталога. Это обеспечивает инкапсуляцию пакетов:
// Project structure:
// myapp/
// main.go
// internal/
// auth/auth.go <- can only be imported by myapp/
// db/db.go <- can only be imported by myapp/
// api/
// handlers.go <- can import myapp/internal/auth
// External package CANNOT do:
// import "myapp/internal/auth" <- compile errorИспользование пакетов internal/
Код в том же модуле (выше каталога internal/) может свободно импортировать внутренние пакеты:
// myapp/api/handlers.go
package api
import (
"myapp/internal/auth"
"myapp/internal/db"
)
func GetUser(id int) (*db.User, error) {
if !auth.IsValid() {
return nil, auth.ErrUnauthorized
}
return db.FindUser(id)
}Зачем использовать internal/
Преимущества соглашения с internal/:
- Не позволяет другим модулям зависеть от деталей реализации
- Позволяет свободно перерабатывать код, не нарушая работу внешних вызывающих программ
- Ясно показывает, что этот код не является частью общедоступного API
- Стандартные инструменты Go обеспечивают соблюдение ограничения во время компиляции
Рабочие области Go — go work
В Go 1.18 появились рабочие области, позволяющие одновременно работать с несколькими локальными модулями без директив replace:
# Create a workspace in parent directory:
go work init ./myapp ./mylib
# Creates go.work:
# go 1.21
# use (
# ./myapp
# ./mylib
# )
# Now myapp can import mylib without replace directivesgo work sync
Синхронизируйте зависимости рабочей области с помощью go work sync:
# go.work file:
go 1.21
use (
./api
./worker
./shared
)
# Sync all module dependencies:
go work sync
# Build across all workspace modules:
go build ./...
# Test across all workspace modules:
go test ./...Рабочая область и директива replace
Сравнение двух подходов к локальной разработке с несколькими модулями:
// BEFORE workspaces (cumbersome):
// go.mod in myapp:
// replace github.com/me/mylib => ../mylib
// Must remove before publishing!
// WITH workspaces (cleaner):
// go.work at root:
// use (./myapp ./mylib)
// go.mod files stay clean — go.work is gitignoredВарианты использования рабочих областей
Когда следует использовать рабочие области Go:
- Одновременная разработка библиотеки и использующей её программы
- Монорепозиторий с несколькими модулями, которые ссылаются друг на друга
- Проверка изменений в общем модуле перед публикацией
- Одновременная работа над ответвлением зависимости и приложением
go work add и go work use
Управляйте записями рабочей области с помощью подкоманд go work:
# Add a module to the workspace
go work use ./newservice
# Remove a module from workspace
go work use -r ./oldservice
# Edit go.work directly (opens $EDITOR):
go work edit
# go.work should usually be gitignored:
echo "go.work" >> .gitignore
echo "go.work.sum" >> .gitignoreinternal/ и рабочие области вместе
Внутренние пакеты и рабочие области естественным образом сочетаются в монорепозиториях:
// Monorepo structure:
// services/
// go.work
// auth-service/
// internal/tokens/ <- private to auth-service
// order-service/
// internal/pricing/ <- private to order-service
// shared/
// models/ <- shared across services
// go.work:
// use (./auth-service ./order-service ./shared)Рекомендации по организации пакетов
Рекомендации по структуре проектов Go:
- Для небольших проектов используйте плоскую структуру пакетов — не усложняйте организацию преждевременно
- Используйте
internal/для деталей реализации, не предназначенных для внешнего использования - Размещайте основные пакеты CLI в
cmd/appname/ - Используйте рабочие области для репозиториев с несколькими модулями, но добавляйте
go.workв список исключений Git - Избегайте глубокой вложенности — не более 3–4 уровней пакетов
Быстрая проверка
Кто может импортировать пакет в каталоге internal/?
Итоги: внутренние пакеты и рабочие области
Итоги:
internal/ограничивает импорты деревом родительского каталога — это ограничение обеспечивает компилятор- Используйте
internal/, чтобы скрывать детали реализации от внешних пользователей go work initсоздаёт рабочую область для локальной разработки с несколькими модулями- Рабочие области заменяют директивы
replaceпри локальной разработке - Добавляйте
go.workиgo.work.sumв список исключений Git
Часто задаваемые вопросы
Урок «Внутренние пакеты и рабочие пространства» бесплатный?
Да — полный текст урока «Внутренние пакеты и рабочие пространства» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Внутренние пакеты и рабочие пространства»?
internal/, директивы replace и go work Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Внутренние пакеты и рабочие пространства»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Пакеты: организация кода Go
- Модули Go с go mod
- Добавление внешних зависимостей
- Внутренние пакеты и рабочие пространства