No.
2023-09-05
  • Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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言語のファイルをインタプリタ言語のように扱うことができる
  • 実行時に行われること:
    1. go runでバイナリファイルがビルドされ、一時ディレクトリに置かれる
    2. そのファイルを実行する
    3. プログラムの実行後、そのファイルが削除される

使用例:

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. 開発環境やバイナリファイルの更新

省略