内部パッケージとワークスペース
internal/、replaceディレクティブ、go work
「内部パッケージとワークスペース」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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 errorinternal/パッケージの使用
同じモジュール内で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ディレクティブの比較
ローカルで複数モジュールを開発する2つの方法を比較します:
// 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とワークスペースの組み合わせ
モノレポでは、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のmainパッケージは
cmd/appname/の下に配置します - 複数モジュールのリポジトリにはワークスペースを使用しますが、
go.workはgitignoreに追加します - 深いネストは避け、パッケージの階層は最大3~4レベルにします
クイックチェック
internal/ディレクトリ内のパッケージをインポートできるのは誰ですか?
まとめ:internalパッケージとワークスペース
まとめ:
internal/はインポートを親ディレクトリのツリー内に制限します。この制限はコンパイラーによって適用されますinternal/を使用して、外部の利用者から実装の詳細を隠しますgo work initは、複数モジュールのローカル開発用ワークスペースを作成します- ワークスペースは、ローカル開発では
replaceディレクティブの代わりになります go.workとgo.work.sumはGitignoreに追加します
よくある質問
「内部パッケージとワークスペース」レッスンは無料ですか?
はい。「内部パッケージとワークスペース」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「内部パッケージとワークスペース」で何を学びますか?
internal/、replaceディレクティブ、go work ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「内部パッケージとワークスペース」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パッケージ:Goコードの整理
- go modによるGo Modules
- 外部依存関係の追加
- 内部パッケージとワークスペース