0Pricing
Go Academy · レッスン

内部パッケージとワークスペース

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 error

internal/パッケージの使用

同じモジュール内で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ディレクティブの比較

ローカルで複数モジュールを開発する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" >> .gitignore

internalとワークスペースの組み合わせ

モノレポでは、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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パッケージ:Goコードの整理
  2. go modによるGo Modules
  3. 外部依存関係の追加
  4. 内部パッケージとワークスペース
← Go Academyに戻る