前提条件

  • Go 1.18 以降のインストール。
  • コードを編集するためのツール。 お持ちのテキストエディタで問題ありません。
  • コマンドターミナル。 GoはLinuxやMacの任意のターミナル、WindowsのPowerShellやcmdでうまく動作します。

このチュートリアルではGo 1.18以降が必要です。go.dev/dlのリンクを使用してGo 1.18以降をインストールしたことを確認してください。

コードのモジュールを作成する

まず、書くコードのためのモジュールを作成します。

  • 1. コマンドプロンプトを開き、ホームディレクトリに移動します。
    LinuxまたはMacの場合:
    1. $ cd
    Windowsの場合:
    1. C:\> cd %HOMEPATH%
    チュートリアルの残りの部分では、プロンプトとして$が表示されます。使用するコマンドはWindowsでも動作します。
  • 2. コマンドプロンプトから、コード用のディレクトリをworkspaceという名前で作成します。
    1. $ mkdir workspace
    2. $ cd workspace
  • 3. モジュールを初期化します
    私たちの例では、golang.org/x/exampleモジュールに依存する新しいモジュールhelloを作成します。
    helloモジュールを作成します:

    1. $ mkdir hello
    2. $ cd hello
    3. $ go mod init example.com/hello
    4. go: creating new go.mod: module example.com/hello

    go getを使用してgolang.org/x/example/hello/reverseパッケージへの依存関係を追加します。

    1. $ go get golang.org/x/example/hello/reverse

    helloディレクトリに以下の内容を持つhello.goを作成します:

    1. package main
    2. import (
    3. "fmt"
    4. "golang.org/x/example/hello/reverse"
    5. )
    6. func main() {
    7. fmt.Println(reverse.String("Hello"))
    8. }

    次に、helloプログラムを実行します:

    1. $ go run .
    2. olleH

ワークスペースを作成する

このステップでは、モジュールを指定するためのgo.workファイルを作成します。

ワークスペースを初期化する

  1. ``````bash
  2. $ go work init ./hello
  3. `

go work initコマンドはgoに対して、go.workファイルを作成するよう指示します。これは./helloディレクトリ内のモジュールを含むワークスペースのためのものです。

  1. ``````bash
  2. go 1.18
  3. use ./hello
  4. `
  1. `````go`````ディレクティブは、ファイルがどのGoのバージョンで解釈されるべきかをGoに指示します。これは`````go`````ディレクティブに似ています。
  2. `````use`````ディレクティブは、`````hello`````ディレクトリ内のモジュールがビルド時にメインモジュールであるべきことをGoに指示します。
  3. したがって、`````workspace`````の任意のサブディレクトリ内でモジュールがアクティブになります。
  4. <a name="run-the-program-in-the-workspace-directory"></a>
  5. #### ワークスペースディレクトリでプログラムを実行する
  6. `````workspace`````ディレクトリで、次のコマンドを実行します:
  7. ``````bash
  8. $ go run ./hello
  9. olleH
  10. `

Goコマンドは、ワークスペース内のすべてのモジュールをメインモジュールとして含めます。これにより、モジュールの外部でもモジュール内のパッケージを参照できます。モジュールまたはワークスペースの外でgo runコマンドを実行するとエラーが発生します。なぜなら、goコマンドはどのモジュールを使用するかを知らないからです。

次に、golang.org/x/example/helloモジュールのローカルコピーをワークスペースに追加します。そのモジュールはgo.googlesource.com/example Gitリポジトリのサブディレクトリに保存されています。次に、reverseパッケージに新しい関数を追加し、Stringの代わりに使用できるようにします。

golang.org/x/example/helloモジュールをダウンロードして修正する

このステップでは、golang.org/x/example/helloモジュールを含むGitリポジトリのコピーをダウンロードし、ワークスペースに追加し、helloプログラムから使用する新しい関数を追加します。

  • 1. リポジトリをクローンする
    ワークスペースディレクトリから、次のgitコマンドを実行してリポジトリをクローンします:
    1. $ git clone https://go.googlesource.com/example
    2. Cloning into 'example'...
    3. remote: Total 165 (delta 27), reused 165 (delta 27)
    4. Receiving objects: 100% (165/165), 434.18 KiB | 1022.00 KiB/s, done.
    5. Resolving deltas: 100% (27/27), done.
  • 2. モジュールをワークスペースに追加する
    Gitリポジトリは./exampleにチェックアウトされました。golang.org/x/example/helloモジュールのソースコードは./example/helloにあります。これをワークスペースに追加します:

    1. $ go work use ./example/hello

    go work useコマンドは、go.workファイルに新しいモジュールを追加します。今は次のようになります:

    1. go 1.18
    2. use (
    3. ./hello
    4. ./example/hello
    5. )

    ワークスペースにはexample.com/helloモジュールとgolang.org/x/example/helloモジュールが含まれ、golang.org/x/example/hello/reverseパッケージを提供します。
    これにより、reverseパッケージのコピーに書く新しいコードを使用できるようになります。go getコマンドでダウンロードしたモジュールキャッシュ内のパッケージのバージョンの代わりに使用します。

  • 3. 新しい関数を追加します。

    1. `````workspace/example/hello/reverse`````ディレクトリに`````int.go`````という名前の新しいファイルを作成し、以下の内容を含めます:
    2. ``````bash
    3. package reverse
    4. import "strconv"
    5. // Int returns the decimal reversal of the integer i.
    6. func Int(i int) int {
    7. i, _ = strconv.Atoi(String(strconv.Itoa(i)))
    8. return i
    9. }
    10. `
  • 4. helloプログラムを修正して関数を使用します。

    1. ``````bash
    2. package main
    3. import (
    4. "fmt"
    5. "golang.org/x/example/hello/reverse"
    6. )
    7. func main() {
    8. fmt.Println(reverse.String("Hello"), reverse.Int(24601))
    9. }
    10. `

ワークスペース内でコードを実行する

ワークスペースディレクトリから、次のコマンドを実行します:

  1. $ go run ./hello
  2. olleH 10642

Goコマンドは、example.com/helloモジュールをhelloディレクトリ内のgo.workファイルで指定されたコマンドラインから見つけ、golang.org/x/example/hello/reverseインポートをgo.workファイルを使用して解決します。

  1. 2つのモジュールが同じワークスペースにあるため、1つのモジュールで変更を加え、別のモジュールで使用するのが簡単です。
  2. <a name="future-step"></a>
  3. #### 今後のステップ
  4. これらのモジュールを適切にリリースするには、`````golang.org/x/example/hello`````モジュールのリリースを行う必要があります。例えば`````v0.1.0`````で行います。これは通常、モジュールのバージョン管理リポジトリでコミットにタグを付けることで行われます。詳細については、[モジュールリリースワークフローのドキュメント](/read/go-latest/92e21fe9493680af.md)を参照してください。リリースが完了したら、`````golang.org/x/example/hello`````モジュールの要件を`````hello/go.mod`````で増やすことができます:
  5. ``````bash
  6. cd hello
  7. go get golang.org/x/example/hello@v0.1.0
  8. `

その方法で、goコマンドはワークスペースの外でモジュールを適切に解決できます。

ワークスペースについてもっと学ぶ

goコマンドには、チュートリアルで以前に見たgo work initに加えて、ワークスペースで作業するためのいくつかのサブコマンドがあります:

  • go work use [-r] [dir]は、dirのためにgo.workファイルにuseディレクティブを追加し、引数のディレクトリが存在しない場合はuseディレクトリを削除します。-rフラグは、dirのサブディレクトリを再帰的に調べます。
  • go work editは、go mod editに似てgo.workファイルを編集します。
  • go work syncは、ワークスペースのビルドリストから各ワークスペースモジュールに依存関係を同期します。

Go Modules Referenceのワークスペースを参照して、ワークスペースとgo.workファイルの詳細を確認してください。