GoLandを使いましょう 2020冬

# はじめに
この記事は[アドベントカレンダー Go5](https://qiita.com/advent-calendar/2020/go5)の22日目の記事です。

みなさん、Goのエディタ何を使っていますか？
Vim? Vscode?

そうですねGolandを使いましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/a6a5f7d5-24b0-816f-75fc-d96d1b4cdfd0.png" width=50%>

[去年](https://qiita.com/junpayment/items/f66e85af6a854ca2a296)も同じタイトルの記事を書いたのですが、最新バージョンも2020.3となり新機能が続々と加わっています。
基本的なセットアップの再掲とともに新機能で僕が良いなあと思ったものをピックアップして行きたいと思います。

# GoLandセットアップ
## 前提環境
mac
windowsやLinuxでも大体同じだと思います。多分。

## Xcode
macで何かしら開発環境を入れるなら何も考えずに入れておきましょう。
インストール長いので最初にやっておきます。
インストールが完了したら下記コマンド。

```
xcode-select
echo "export SDKROOT=\"$(xcrun --sdk macosx --show-sdk-path)\"" >> ~/.bash_profile
```

## 購入
本家で買っても良いですが、国内代理店のサムライズムさんで買うと200円くらい安いです。
https://samuraism.com/jetbrains/goland
https://www.jetbrains.com/ja-jp/go/buy/#commercial?billing=yearly

どちらで買っても以降のアカウント管理はJetBrainsのマイページで行うことになるのでそこら辺は変わりません。

(サムライズムさんで購入すると購入完了メールが届くまで5分くらいかかるかな?)

買うと以降は下記の流れで購入したライセンスの確認ができるようになります。

- 購入完了メールにpdfがついてくる
- pdfにマイページのワンタイムなリンクがついてくる
- リンク踏んでJetBrainsにログイン(or新規登録&ログイン)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/5faa3f62-c279-d14d-c99d-a3f47a860f2b.png" width=50%>

*筆者は日頃複数言語使うので[All Products Pack](https://www.jetbrains.com/ja-jp/all/)を買っています。JetBrainsのほぼ全てのIDEを使えるのでおすすめです。*

### 無料体験版ももちろんあるよ
https://www.jetbrains.com/ja-jp/go/download/#section=mac

## インストール
GoLandをそのまま単体でインストールしても良いんですが、[Toolbox App
](https://www.jetbrains.com/ja-jp/toolbox-app/)を使いましょう。

IDEの自動アップデートが簡単になります。
他にもJVMのヒープサイズの変更など細かい設定ができるようになります。

## アクティベーション
Toolbox App上でJetBrainsアカウントにログインすることでアクティベーションできます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/fbfd6bb0-b589-b232-b307-a06f8b2235a1.png" width=50%>

ブラウザ経由でログインするのですが、最終的に`jetbrains://toolbox/jba/auth?code=xxx`にリダイレクトされます。
この際、もしかしたら下記のような警告画面が表示されるかもしれません。
ツールにリダイレクトされるだけなので、`このまま送信`をクリックしてしまってください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/55eec1b3-da6f-cede-1f0f-9db7812449c3.png" width=50%>

## anyenv,goenv
GoLand経由でGoインストールもできるんですが、CLIオペレーションも考慮して`anyenv,goenv`の使用をお勧めします。

anyenvインストール
こちら参照
https://github.com/anyenv/anyenv#1-install-and-configure-anyenv

anyenv-updateも入れる
https://github.com/znz/anyenv-update#installation

goenvのインストール

```
anyenv install goenv
exec $SHELL -l
```

Goインストール

```
echo "export GOENV_DISABLE_GOPATH=1" >> ~/.bash_profile
source ~/.bash_profile
anyenv update #アップデート情報が更新される
goenv install -l #現在インストール可能なバージョンが表示
goenv install 1.15.6 #最新バージョンをインストール
```

## goenvの更新スピードについて
[goenvがホストされているリポジトリ](https://github.com/syndbg/goenv)に[`toshi0607`](https://github.com/toshi0607)さんが怒涛のごとくPRを投げていますが、たまにちょっとマージまで時間差が発生することがあります。そんな時は双方にスポンサーするか👍しましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/13720df5-4ade-db82-4dda-7f54132c37c3.png" width=30%>

# 起動〜コーディング〜テスト実行
というわけで諸々準備できたので起動しましょう。

起動したら`New Project -> Go modules`を選択し、`GOROOT`は先ほどインストールしたGoのディレクトリを選択します。

```
${HOME}/.anyenv/envs/goenv/versions/1.15.6
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/784cf2f8-1828-11cb-a1c5-de542a2b225f.png" width=50%>

`Create`をクリックします。

そして下記のファイルを作りましょう。

```
hoge/
 |- go.mod #最初からある
 |- hoge.go #これ作る
 `- hoge_test.go #作る
```

```go:hoge.go
package hoge

import "fmt"

func Do(input string) error {
	if input == "yeah" {
		return nil
	}
	return fmt.Errorf("ahhh")
}
```

```go:hoge_test.go
package hoge

import "testing"

func TestDo(t *testing.T) {
	// 配列にテストケースを記載
	testCases := []struct {
		name  string
		input string
		isErr bool
	}{
		{
			name:  "success",
			input: "yeah",
			isErr: false,
		},
		{
			name:  "error",
			input: "ahhh",
			isErr: true,
		},
	}
	for _, testCase := range testCases {
		t.Run(testCase.name, func(t *testing.T) {
			err := Do(testCase.input)
			isErr := err != nil
			if isErr == testCase.isErr {
				t.Log("good!")
			} else {
				t.Error("bad!")
			}
		})
	}
}

```

おもむろに↓な感じでデバッグポインタを作って`Debug go test hoge`をしてみましょう
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/240bac1a-a50f-4f19-9484-369839a99634.png" width=50%>

テストできましたね。デバッグポインタ部分で止まったりしましたね。人権をゲットできました。

今回は配列`testCases`にテストケースを記載しているのですが、GoLandはテーブルテストに対応しているのでテスト単位ではなくレコード単位でテスト再実行できます。
![スクリーンショット 2020-12-22 22.45.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/b868e1ab-60df-ba4a-055b-bb51f52e93f0.png)

これで一通り完了です。おつかれさまでした。

# GoLandのメリット
上記の通り、`Vim, VSCode`はイチから環境構築する楽しみがあると思いますが、GoLandは**最初から大体良い感じに仕上がってる**ので初回インストールからプロダクトコードを書いていくことができます。

もちろんPluginのマーケットもあるので、IDE上から欲しい機能を追加インストールできます。

# 新機能
かなりの頻度でアップデートされ、2020.3ではgorutine, テスト周りの機能が拡充されました。
https://www.jetbrains.com/ja-jp/go/whatsnew/

個人的には**テーブルテスト**、**testifyサポート**、**goroutineダンプの検索方法改善**がアツいです。

# 最後に
比率としてはJetBrains製品はなかなかですが、みなさんGoLandを使いましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12060/54b79118-9f69-0635-3ad0-fd9f20981b60.png)
[引用]https://job-draft.jp/articles/419

以上