Go Modulesを利用してローカル環境でGo言語を実行する手順

Go言語

2021年5月現在、Go言語のパッケージ管理はGo Modulesが標準となっています。
今回はGo Modulesを利用してGo言語を実行する手順について紹介します。

ローカル環境で初めてGo言語を実行する人向けの記事となっています。

今回利用するGoのバージョンは1.16.3です。

作業ディレクトリの作成・移動

まずは作業ディレクトリの作成と移動をします。

$ mkdir go-example && cd $_

Go Modulesの初期化

go mod init [モジュール名]でGo Modulesの初期化をします。

モジュール名にはモジュールの公開パスを指定するのが正確ですが、公開前提でなければパスでなくても問題ありません。

### サンプルコードなどであれば以下のような感じでOK
$ go mod init go-example

### 公開前提の場合はモジュールのパスを指定する
$ go mod init github.com/nishina555/go-example

以下のようなgo.modが作業ディレクトリに作成されればOKです。

go.mod

module go-example

go 1.16

必要なパッケージをインストールする

たとえば以下のようなmain.goを作成したとします。このファイルを実行するにはrsc.io/quoteが必要です。

main.go

package main

import (
    "fmt"

    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}

importに記載されたパッケージはgo getもしくはgo mod tidyでインストールします。
コマンドによって実行される内容は以下の通りです。

コマンド 実行内容
go get [パッケージ名] 指定したパッケージのインストール
go get importに記載されたパッケージのインストール
go mod tidy importに記載されたパッケージのインストール。
不要なパッケージの削除

パッケージをインストールするとgo.modおよびgo.sumに情報が反映されます。

### パッケージのインストール
$ go mod tidy

### パッケージがインストールされると go.sumが作成される
$ ls
go.mod  go.sum  main.go

### go.modに rsc.io/quote の情報が追加されている
$ cat go.mod

module go-example

go 1.16

require rsc.io/quote v1.5.2

### go.sumに rsc.io/quote をインストールした際のチェックサム情報が追加されている
$ cat go.sum

golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

モジュールの依存するパッケージ一覧はgo list -m allgo mod graphで確認できます。

### 依存パッケージ一覧
$ go list -m all

go-example
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0

### 依存関係の表示
$ go mod graph

go-example rsc.io/quote@v1.5.2
rsc.io/quote@v1.5.2 rsc.io/sampler@v1.3.0
rsc.io/sampler@v1.3.0 golang.org/x/text@v0.0.0-20170915032832-14c0d48ead0c

go getgo mod tidyによってインストールされたパッケージは$GOPATH/pkg/modに保存されます。

### golang.org や rsc.io が作成されている
$ ls $GOPATH/pkg/mod/

cache  golang.org  rsc.io

Goファイルのコンパイルと実行

go buildでGoファイルのコンパイルをし、作成されたバイナリファイルを実行します。

### コンパイルしてバイナリファイル(main)を作成
$ go build main.go

### バイナリファイルを実行
$ ./main

Hello, world.

以下のようにするとワンライナーでコンパイルと実行ができます。

$ go build main.go && ./main

Hello, world.

go runを利用すると、バイナリファイルを作成せずに直接Goファイルの実行ができます。
ただしgo rungo buildとは異なり、importされたパッケージしか読み込まないので注意が必要です。

$ go run main.go

Hello, world.

参考: go buildによるパッケージの自動インストールについて

Go 1.15まではgo buildでビルドだけでなく、パッケージのインストールも行われました。
しかし、Go 1.16からはgo buildによるパッケージのインストールが廃止されました。

ですので、パッケージのインストールが必要なGoファイルを実行する場合、Go 1.16では『go mod tidy or go get』 → 『go build』という手順になります。

まとめ:

GoModulesを利用したGo開発の手順
  1. 『go mod init』でGo Modulesの初期化
  2. 実装をする
  3. 『go get』もしくは『go mod tidy』で必要なパッケージをインストール
  4. パッケージが不要になったら『go mod tidy』で削除
  5. 『go build』でコンパイル後、、バイナリファイルを実行。あるいは『go run』でコンパイル&実行

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考