Go言語基礎 その2 Go言語の開発環境と go コマンド

はじめに

前回は Go 言語の概要を書きましたが、今回は go コマンドに関してまとめておきたいと思います。

準備

  • Go 言語の公式サイトからインストール先の OS 毎の手順に沿ってインストールを行う。
  • インストール後、コマンドプロンプト(Mac ならターミナル、Windows ならコマンドプロンプト)など CLI から go コマンドを実行できるか確認する
$ go version
go version go1.17.6 darwin/amd64

goenv を使用すると複数の Go のバージョンを管理できます。

go コマンドに関して

go 言語で開発する際には必ず使用するこの go コマンドに関してざっくりと要点をまとめておきたいと思います。

いろいろな go コマンドがあるが、この中から(個人的に)よく使用するものを紹介する

  • go help
  • go version
  • go env
  • go build
  • go run
  • go fmt
  • go install
  • go mod
  • go test
  • go clean
  • go doc
  • go get

go help

go helpgo help <command> で ヘルプを見れる

$ go help
Go is a tool for managing Go source code.

Usage:

	go <command> [arguments]

The commands are:

	bug         start a bug report
	build       compile packages and dependencies
	clean       remove object files and cached files
	doc         show documentation for package or symbol
	env         print Go environment information
	fix         update packages to use new APIs
	fmt         gofmt (reformat) package sources
	generate    generate Go files by processing source
	get         add dependencies to current module and install them
	install     compile and install packages and dependencies
	list        list packages or modules
	mod         module maintenance
	run         compile and run Go program
	test        test packages
	tool        run specified go tool
	version     print Go version
	vet         report likely mistakes in packages

Use "go help <command>" for more information about a command.

Additional help topics:

	buildconstraint build constraints
	buildmode       build modes
	c               calling between Go and C
	cache           build and test caching
	environment     environment variables
	filetype        file types
	go.mod          the go.mod file
	gopath          GOPATH environment variable
	gopath-get      legacy GOPATH go get
	goproxy         module proxy protocol
	importpath      import path syntax
	modules         modules, module versions, and more
	module-get      module-aware go get
	module-auth     module authentication using go.sum
	packages        package lists and patterns
	private         configuration for downloading non-public code
	testflag        testing flags
	testfunc        testing functions
	vcs             controlling version control with GOVCS

Use "go help <topic>" for more information about that topic.

例) go clean コマンドのヘルプ

$ go help clean
usage: go clean [clean flags] [build flags] [packages]

Clean removes object files from package source directories.
The go command builds most objects in a temporary directory,
so go clean is mainly concerned with object files left by other
tools or by manual invocations of go build.

If a package argument is given or the -i or -r flag is set,
clean removes the following files from each of the
source directories corresponding to the import paths:

        _obj/            old object directory, left from Makefiles
        _test/           old test directory, left from Makefiles
        _testmain.go     old gotest file, left from Makefiles
        test.out         old test log, left from Makefiles
        build.out        old test log, left from Makefiles
        *.[568ao]        object files, left from Makefiles

        DIR(.exe)        from go build
        DIR.test(.exe)   from go test -c
        MAINFILE(.exe)   from go build MAINFILE.go
        *.so             from SWIG

In the list, DIR represents the final path element of the
directory, and MAINFILE is the base name of any Go source
file in the directory that is not included when building
the package.

The -i flag causes clean to remove the corresponding installed
archive or binary (what 'go install' would create).

The -n flag causes clean to print the remove commands it would execute,
but not run them.

The -r flag causes clean to be applied recursively to all the
dependencies of the packages named by the import paths.

The -x flag causes clean to print remove commands as it executes them.

The -cache flag causes clean to remove the entire go build cache.

The -testcache flag causes clean to expire all test results in the
go build cache.

The -modcache flag causes clean to remove the entire module
download cache, including unpacked source code of versioned
dependencies.

For more about build flags, see 'go help build'.

For more about specifying packages, see 'go help packages'.

go version

go のバージョンを確認できる

$ go version
go version go1.17.6 darwin/amd64

go env

go に関連する環境変数の一覧を表示する。
よく使用するものは以下の環境変数。

  • GOROOT Go の SDK のパスを設定。インストール時に設定されていることが多いため基本設定変更は不要。
  • GOPATH Go 言語のワークスペース。 $GOPATH/src 配下に Go のソースコードを配置する。
  • GOARCH クロスコンパイル時に出力ターゲットのアーキテクチャを設定、デフォルトは開発環境の OS
  • GOOS クロスコンパイル時に出力ターゲットの OS を設定、デフォルトは開発環境の OS
  • CGO_ENABLED cgo を使用して C/C++言語のコードを呼び出す際に 1 を設定して有効にする
  • GO111MODULE モジュール管理のモード(go modで後述)を指定、デフォルトは OFF(モジュール対応モードを使用)
$ go env
GO111MODULE=""
GOARCH="amd64"
:
:
:

GOPATH$HOME/go 配下に設定しておき、以下のようなディレクトリ構成にすることが好ましい

.
├── bin
├── pkg
└── src
  └─┬─ github.com/owner
    ├── project-a
    │ └── main.go
    └── project-b
      └── main.go

go build

  • 対象の go のソースコードをコンパイルするためのコマンド
  • -o で生成する実行ファイルの名前を指定できる
$ go build -o main main.go

go run

  • コンパイル+実行までを一つのコマンドでできる便利コマンド
  • 開発時に go run main.go のようにコマンド一発で起動したい場合によく使う
  • Docker のコンテナ内などで実行する際には go build でビルドしたバイナリを使用する

go fmt

go のソースコードを自動的に整形するためのコマンド

go install

  • パッケージや実行ファイルをビルドした結果を既定の場所にインストールするためのもの。
  • Go 製の CLI ツールをインストールするのによく使う。
  • $GOBIN または $GOPATH/bin に配置される。

下の例は [github.com/Songmu/gocredits]](https://github.com/Songmu/gocredits) をインストールする例です。

$ go install github.com/Songmu/gocredits/cmd/gocredits@latest
go: downloading github.com/Songmu/gocredits v0.2.0

インストール後は gocredits と打つだけでパスが通っているので使えます。

$ gocredits -version
gocredits v0.2.0 (rev:HEAD)

go mod

  • Go のモジュール管理を行うコマンド
  • Go 言語では標準ライブラリ以外のパッケージを「モジュール(module)」として管理する
  • 以前は GOPATH モード GOPATH mode が標準だったが、今はモジュール対応モード module-aware mode が標準
  • モジュール対応モードでは go.mod ファイルを使用してモジュールを管理する 公式仕様
  • プロジェクトの作成時などは go mod init コマンドで初期化する
  • go mod install コマンドで 必要なモジュールをローカルのキャッシュに一括ダウンロードできる。
  • go mod tidy コマンドでいい感じに go.mod ファイルを更新してくれる(未使用だったり削除済みのモジュールを管理対象から自動で外す、自動で必要なモジュールをダウンロード)
$ go mod init
go: creating new go.mod: module github.com/owner/project_name
go: to add module requirements and sums:
	go mod tidy

go test

go test または go test <target_directory> で 指定したパッケージ(=ディレクトリ内の)テストコードを実行できる

  • -v 詳細表示
  • -cover カバレッジを表示
  • -run <regexp> 正規表現にマッチしたテスト関数のみ実行する
  • -race

go clean

go buildgo test の生成したファイルを削除するコマンド

	_obj/            old object directory, left from Makefiles
	_test/           old test directory, left from Makefiles
	_testmain.go     old gotest file, left from Makefiles
	test.out         old test log, left from Makefiles
	build.out        old test log, left from Makefiles
	*.[568ao]        object files, left from Makefiles

	DIR(.exe)        from go build
	DIR.test(.exe)   from go test -c
	MAINFILE(.exe)   from go build MAINFILE.go
	*.so             from SWIG

go doc

go のパッケージのドキュメントを参照するためのコマンド
ソースコードに記述されたコメントをそのままドキュメントとして利用する

go get

外部パッケージのダウンロードとインストールをまとめて実行するためのコマンド go installgo run の機能拡張に伴い、非推奨になりつつあるオワコンコマンド

go get: installing executables with 'go get' in module mode is deprecated.
	To adjust and download dependencies of the current module, use 'go get -d'.
	To install using requirements of the current module, use 'go install'.
	To install ignoring the current module, use 'go install' with a version,
	like 'go install example.com/cmd@latest'.
	For more information, see https://golang.org/doc/go-get-install-deprecation
	or run 'go help get' or 'go help install'.

参考にした本

おわりに

こんな感じでざっくりよく使う go コマンドをまとめてみました。
次回は Go 言語の文法を復習したいと思います。