はじめに
この実験では、Go 言語における依存関係管理の 2 つの異なる手法である GOPATH と Go モジュール(Go Modules) について学びます。これらは、Go プロジェクトを効果的に整理・管理するために不可欠な概念です。
学習ポイント:
- GOPATH
- GOROOT
- Go モジュール(Go Modules)
準備
このステップでは、提供されたアーカイブファイルを解凍して、実験環境を準備します。
まず、ターミナルを開き、以下のコマンドを入力してプロジェクトディレクトリに移動します。
cd ~/projectカレントディレクトリにある
helloWorld.tar.gzファイルを解凍します。tar -xzf helloWorld.tar.gzファイルの展開後、
helloWorldフォルダが作成されているか確認します。ls helloWorld
正しく解凍されていれば、helloWorld ディレクトリの内容が表示されます。
GOPATH の基本
Go 1.11 より前のバージョンでは、Go はすべてのソースコードを保存するために GOPATH と呼ばれる特定のワークスペースを使用していました。このステップでは、GOPATH の仕組みを理解しましょう。
GOROOTは、Go がインストールされているディレクトリであり、Go のツールや標準ライブラリパッケージが含まれています。GOPATHは、ユーザー自身の Go コードが置かれる場所で、以下の 3 つのディレクトリで構成されます。- src: プロジェクトのソースコードを保存します。
- bin: コンパイルされた実行ファイルを保存します。
- pkg: 実行ファイルではない、コンパイル済みのパッケージを保存します。
現在の GOPATH と GOROOT を確認するには、以下のコマンドを実行します。
## GOPATH ディレクトリを確認する
go env | grep GOPATH
## GOROOT ディレクトリを確認する
go env | grep GOROOT
これらのコマンドにより、お使いの環境における GOPATH と GOROOT のパスが表示されます。
モジュールの初期化
Go 1.11 で導入され、Go 1.13 からデフォルトで有効になった Go モジュール(Go Modules)は、主に以下の 2 つの問題を解決することを目的としています。
- GOPATH への過度な依存: Go モジュール以前は、コードを必ず
GOPATH/srcディレクトリ内に配置する必要がありました。Go モジュールを使用すると、システムの任意の場所にコードを保存できます。 - 依存関係のバージョン管理: Go モジュールでは、プロジェクトが特定のバージョンの依存関係を管理・追跡できるため、同じパッケージの異なるバージョンを扱うのが容易になります。
このステップでは、新しいプロジェクトで Go モジュールを初期化します。
testHelloという名前の新しいプロジェクトディレクトリを作成します。cd ~/project mkdir testHellotestHelloディレクトリに移動します。cd testHelloこのプロジェクトの Go モジュールを初期化します。
go mod init testHello出力結果は以下のようになります。
go: creating new go.mod: module testHellotestHelloフォルダ内に、以下の内容で新しい Go ファイルtestHello.goを作成します。touch testHello.gopackage main import "fmt" func main() { fmt.Println("hello, world") }
これで、Go モジュールを使用して testHello プロジェクトを初期化し、簡単な Go プログラムを追加できました。
モジュールを使用した他のパッケージのインポート
このステップでは、Go プロジェクトで他のモジュールをインポートして使用する方法を実演します。
helloWorld フォルダ内の helloWorld パッケージは、すでに Go モジュールで初期化されています。同様に、Go モジュールを使用している test パッケージは、helloWorld パッケージから Say 関数をインポートしています。
内容を確認するために、以下の手順を実行してください。
まず、
helloWorldとtestディレクトリの構造を確認します。helloWorld ├── go.mod └── helloWorld.go test ├── go.mod └── test.go次に、
test/go.modファイルを開きます。以下のような内容が記述されているはずです。module test go 1.15 require "helloWorld" v0.0.1 replace "helloWorld" => "../helloWorld"
replace ディレクティブは、外部リポジトリから取得する代わりに、ローカルパス ../helloWorld を使用するように Go に指示します。require ディレクティブは、test パッケージが helloWorld パッケージのバージョン v0.0.1 に依存していることを指定しています。
| パラメータ | 説明 |
|---|---|
| module | パッケージ名を指定します |
| require | 依存関係を指定します |
| replace | 依存関係を置き換えます |
| exclude | 依存関係を除外します |
test パッケージ内の test.go ファイルを実行するには、以下のようにします。
cd ~/project/test
go run test.go
出力結果は以下の通りです。
hello, world
リモートパッケージのインポート
Go では、リモートパッケージを簡単にインポートできます。GitHub 上のリモートパッケージを使用して、これを試してみましょう。
remoteModuleディレクトリを作成します。cd ~/project mkdir remoteModule cd remoteModuleGo モジュールを初期化します。
go mod init remoteModuleremoteModuleフォルダ内に、以下の内容でremote.goファイルを作成します。touch remote.gopackage main import ( "github.com/labex-labs/golang-dev-code/chap02module" ) func main() { chap02module.StringTobase64("miiy") }このプログラムは、GitHub から
chap02moduleパッケージをインポートし、その中のStringTobase64関数を使用します。以下のコマンドを使用して
remote.goファイルを実行します。go get github.com/labex-labs/golang-dev-code/chap02module go run -v remote.goヒント:無料ユーザーはインターネットにアクセスできないため、このコマンドを実行できません。インターネットアクセスを利用するには、Pro プランへのアップグレードをご検討ください。
go get コマンドは、GitHub から chap02module パッケージをダウンロードし、モジュールキャッシュに保存します。完了後、go run コマンドによってプログラムが実行されます。
ミニテスト
このステップでは、リモートモジュールの Hello 関数を使用する新しいファイルを作成し、これまでの知識をテストします。
remoteModule2フォルダを作成します。cd ~/project mkdir remoteModule2 cd remoteModule2Go モジュールを初期化します。
go mod init remoteModule2以下の内容で
remote2.goファイルを作成します。touch remote2.gopackage main import ( "github.com/labex-labs/golang-dev-code/chap02module" ) func main() { chap02module.Hello() }プログラムを実行します。
go get github.com/labex-labs/golang-dev-code/chap02module go run remote2.go出力結果は以下の通りです。
hello
まとめ
この実験では、以下の内容を学びました。
GOPATHおよびGOROOTディレクトリの意味と目的。- 依存関係を管理するための Go モジュールの基礎。
- プロジェクトで Go モジュールを初期化し、使用する方法。
- ローカルおよびリモートの Go パッケージをインポートして使用する方法。
この実験を終えることで、Go プロジェクトの依存関係を管理するために Go モジュールを使いこなせるようになっているはずです。



