0Pricing
Go Academy · Урок

Внутренние пакеты и рабочие пространства

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 directives

go 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" >> .gitignore

internal/ и рабочие области вместе

Внутренние пакеты и рабочие области естественным образом сочетаются в монорепозиториях:

// 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 — локальная установка не требуется.

Все уроки этого курса

  1. Пакеты: организация кода Go
  2. Модули Go с go mod
  3. Добавление внешних зависимостей
  4. Внутренние пакеты и рабочие пространства
← Назад к Go Academy