Golang環境整える。Windows（WSL2、WSL）、Mac、Docker、VSCode(+Remote Docker)Golint・・・ 

#motivation
今、仕事にメインで使ってるPCが3台あり、それぞれの環境が異なります
デスクトップ：Windows10 Pro InsidePreview ＋ WSL2
RazerBlade ゲーミングPC： Windows10 Pro ＋ WSL
Macbook Pro： Catalina
また、近々、ゲーミングPCの買い替え、デスクトップの再インストール等を予定していて
それぞれの環境構築を色々と試した結果、現在の環境構築のメモ

一応、WSLはUbuntu18.04 を想定してますが、他のLinuxでもだいたい同じはず


完全に自分用です

#Windows： WSL＆Docker
Goはサーバインフラで使われることが多いので、たいていの場合はDockerが必要かと思います
また、仕事では他の人はBashでスクリプトを書いてくると思います
そのため、Bashはほぼ必須といってよいです
もちろん古風なVirtualBoxにLinuxをインストールしてもいいですが
WSLやWSL2を使う方が現代的で好みです

WSL、WSL2、Dockerまわりの環境構築は下記にメモしてあります

https://qiita.com/YukiMiyatake/items/c7896a0fc5abfa6c2300
https://qiita.com/YukiMiyatake/items/73c7d6c4f2c9739ebe60


#Goのインストール
公式の通りに行います
https://golang.org/doc/install

以前はgoenv等のバージョニングシステムを使っていたのですが
なぜかVSCode等の相性がわるく（goenvが設定した$GOPATH等を見てくれない事がある）
使うのをやめました。

しかも公式でバージョニングの方法も書いてありました

##インストール
まずはGoがインストールされていたら消します

その後、インストールしますが、パッケージからインストールするとバージョンが古いため
公式が配布しているイメージからインストールします
公式ページには下記のスクリプトが書いてあります

```bash
tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
```

OSや取得バージョンに合わせてダウンロードファイルを変更しますが
具体的には下記のようにします（Goのバージョンは現時点で最新の 1.14.3）


```bash:Windows(WSL、WSL2)
wget https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.14.3.linux-amd64.tar.gz
```

```bash:Mac
wget https://dl.google.com/go/go1.14.3.darwin-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.14.3.darwin-amd64.tar.gz
```

これで、 `/usr/local/go` にインストールされる。

念のため `go version` で正しくインストールされているか確認を行い
`go env` で、GOの環境変数を確認しましょう

おそらく、 `GOROOT="/usr/local/go"` `GOPATH="$HOME/go"`
になっているはず

GOROOTの方にGoのバイナリが入り、GOPATHにはダウンロードしたパッケージやバイナリが入る
ので、ここにパスを通しておく

たとえば.bashrc等に

```bash: bashrc
export GOPATH="$HOME/go"
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:/usr/local/go/bin
```

と書く（GOPATHはおそらくデフォルトで指定されてるが念のためかいてる)
$GOPATH/binにも通しておく


##バージョニング
公式によると

```bash
go get golang.org/dl/go1.10.7
go1.10.7 download
```

go getで任意のバージョンをインストールし

```bash
go1.10.7 version
```

で、使うバージョンを指定できるらしい。
非常に便利だ

ただし `$HOME/go/bin` やsrcが同じなため、複数バージョンのファイルが混在する事になるので
以前はGoのバージョンごとに $GOPATHを切り替えていたが
他の人の話をきくかぎり、混在しても問題がおきた事がないとの話なので
GOPATHをわけない方針に変更した


##gcc
GoのパッケージにはGCCを使うものも多いためGCCをインストールする
Clang派ではあるが、手軽にaptやbrewを使ってGCCをインストールする

##makeのインストール
GoのプロジェクトはMakeで行う事が多いので
パッケージマネージャを使いMakeをインストールしておく


#VSCode
VSCodeのインストールはWindowsもMacもパッケージでインストールした

##リモートWSL: Windows
MacではデフォルトでBashになっていて、ネイティブにGoをインストールしているので対応なくてよい

Windowsは今回はWSL上で動かす
リモートWSLを使うと、WSL上でそのままデバッグしたり実行したり非常に便利なので
VSCode＋リモートWSLをお勧めする


WSL2ではなぜか、VSCodeが初期状態でリモートWSLが有効になっていた気がするが・・
左下にWSLアイコンが出ない場合は、VSCode上からリモートWSLをインストールしよう

##リモートWSLでプロジェクトを開く
必ずリモートWSLで開くこと！
左下のWSLボタンを押し、Remote-WSL:NewWindowで新規ウインドウを開き、OpenFolderする
気を付けるのは、この時にWSLのパスを入力する事。
WindowsパスやShowLocalで選ぶと、リモートWSLにならない


##プラグイン(Extensions)導入
VSCodeのExtensionsメニューより、とりあえずGoプラグインをインストールする

その後、Ctrl+Shift+Pでコマンドパレットを開き `GO:Install/Update Tools`を選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13916/c348da20-d0d0-c60d-dc47-48e2bbeddd2e.png)

必要なものにチェックボックスをつけ、インストールする

```bash
$ ls $GOPATH/bin

dlv         go-outline  gocode        godef     gofmt      golint        gopkgs  gorename  impl
fillstruct  go-symbols  gocode-gomod  godoctor  goimports  gomodifytags  goplay  gotest    guru
```

このように$GOPATH/binにインストールされる


##ビルド、デバッグ実行、テスト等
適当なプロジェクトを使い
まずはVSCodeのターミナルからテスト

```bash
go buid .
./実行ファイル
go test .
```

VSCodeからデバッグ実行するために、ブレークポイントをおきF5キー押しデバッグ出来る事の確認
動かない場合は Launch.jsonを修正する

例えば、プロジェクトに `/server` `/client` の2つのプロジェクトがある場合は

```json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Client",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "program": "${workspaceFolder}/client"
        },

        {
            "name": "Server",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "program": "${workspaceFolder}/server"
        }
    ]
}
```

こんな感じで書いておく。細かい構文は調べてね・・

###単体テストの確認
Goファイルの関数を右クリックして、コンテキストメニューに
`Go:Generate Unit Tests For Function`
がある事を確認し、クリックすると単体テストコードを自動生成してくれる
そして、テスト側のコードに移動し、関数の上に `run test | debug test`が表示される
それをクリックし、関数単位でテストの実行、デバッグの実行が出来る事を確認する

Extensionsで、Go Test Explorerをインストールする。
UIを使って個別にテストを実行したり、Faildの確認したり出来て多少便利だ


#その他パッケージ
あまりパッケージに詳しくないため、便利なパッケージを日々探している
単純に出力が色分けされるだけで快適になったりする

### grpc-go
gRPCを使う場合には必須になる
`go get -u google.golang.org/grpc`

### colorgo
go buildの出力がカラフルになる
`go get -u github.com/songgao/colorgo`

### gotests
go testの出力がカラフルになる
`go get -u github.com/cweill/gotests/...`

### gocheck
go testより高機能
`go get -u gopkg.in/check.v1`

### sql-migrate
DBのマイグレーションツール
`go get -u github.com/rubenv/sql-migrate/...`

### mockgen
インターフェースモックを作成
`go get -u github.com/golang/mock/mockgen`