Go環境のセットアップ
1. インストール
Mac
brew install go
Windows
choco install golang
バージョン確認
go version
2.ディレクトリ
- コード・プロジェクトの構成方法は過去何度か変更されてきた
- そのため、ネット上では古い説明・間違った説明がたくさんある
現在:
- 好きなディレクトリに配置して良い
- モジュールやパッケージはホームディレクトリ下の、goディレクトリにダウンロードされる
- コマンドはgo/binディレクトリにインストールされる
- コマンドの検索パスにこのディレクトリを追加する必要がある
- GOPATHという環境変数で場所を変えることもできる
- GOROOTの設定は不要
- 現在はgoコマンドが自動で見つけてくれるため
- その他の環境変数は
go env
で確認可能- モジュールの設定やクロスコンパイルの時は確認しよう
3. goコマンド
3.1 go run
- go言語のファイルをインタプリタ言語のように扱うことができる
- 実行時に行われること:
go run
でバイナリファイルがビルドされ、一時ディレクトリに置かれる- そのファイルを実行する
- プログラムの実行後、そのファイルが削除される
使用例:
go run hello.go
3.2 go build
- 実行時にバイナリファイルが生成される
- 実行形式のバイナリファイルを再利用する時はこちらのコマンドを使う
使用例:
go build hello.go
ファイル名や保存先を指定したい場合:
go build -o greet/hello_world hello.go
バイナリファイルの実行方法:
./hello_world
3.3 go mod
- ある程度の規模のプロジェクトではモジュールを使うことになる
go mod init モジュール名
でモジュールの初期化、go.modファイルが生成されるgo mod tidy
でソースコードを解析して、必要なライブラリのダウンロードや、不必要になったファイルの削除をしてくれる- go.modファイルがあると、
go build
するときにファイル名を指定しなくても、自動でディレクトリ内にある.goファイルを解析してコンパイルしてくれる- 生成されるファイル名はモジュール名と同じになる
使用例:
go mod init hello-world
go mod tidy
go build
3.4 go install
- バイナリ形式のファイルが配布されている場合がある
- 公開されていれば、
go install
コマンドでインストールできる
- 公開されていれば、
- Go言語のコードの公開方法は他の言語と異なる
- ソースコードのリポジトリを介してインストールする
- リポジトリの位置を指定し、@でバージョンを指定する。
- 最新版は@latestで取得できる
- JavaScriptのnpmのような中央集権的なレジストリは存在しない
使用例:
go install github.com/rakyll/hey@latest
ツールのパスを通す:
# ~/.zshrcに以下を追記
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
3.5 フォーマット
go fmt
- 標準形式にフォーマットしてくれる
- 機能強化版のgoimportsというツールもある
- import文もクリーンにする
- -lでフォーマットが正しくないファイルを表示
- -wで直接書き換える
- 全てのファイルを指定するときは
.
で指定
goimportsのインストール:
go install golang.org/x/tools/cmd/goimports@latest
使用例:
goimports -l -w .
4. lintとvet
- go fmtはフォーマットを正しくするだけ
- lint:
- よりイディオム的な(Goらしい)コードを書くために使う
- 例:staticcheck,golangci-lint
- go vet:
- 潜在的なエラー(関数に渡す引数の数を間違えている、使われない変数に値を代入しているなど)を見つけ出すために使う
staticcheckのインストール:
go install honnef.co/go/tools/cmd/staticcheck@latest
使い方:
# 自動で.goファイルを検知してlintしてくれる
staticcheck
go vet
5. VSCode
省略
6. Makefile
- ビルド時に毎回lintやfmtなど複数コマンドを実行するのはめんどい…
- Makefileを使えば1つにまとめられる!
Makefileの記法:
fmt:
などはターゲットと呼ばれ、実行するコマンドの識別子として使われる- DEFAULT_GOALはデフォルトで実施されるターゲットを示す。
make
で何も指定しなかったときのターゲット。build: vet
のvetは、ターゲットの前提となるタスクで、buildの実行前にvetが実行されるという意味である- 以下の記述例では、fmt -> vet -> build の順で実行される
記述例:
.DEFAULT_GOAL := build
fmt:
go fmt
.PHONY: fmt
lint: fmt
staticcheck
.PHONY: lint
vet: fmt
go vet
.PHONY: vet
build: vet
go mod tidy
go build
.PHONY: build
7. 開発環境やバイナリファイルの更新
省略