[Go]実務でよく使うGoLandの機能

Goの現場に入り、コーディングに使用するエディタが VSCode から **GoLand**(こっちはIDEですが)になって一ヶ月半ほど経過した。
諸先輩方にアドバイスをいただいた上で、自分が取り入れたプラグインや機能が頭打ちになったのでアウトプットしておく。
GoLandは日本語化してる前提。また、ショートカットはMac前提。


# 1. プラグイン
プラグイン名|説明
---|---
Indent Rainbow|インデントを階層ごとに色分け
Rainbow Bracket|カッコを階層ごとに色分け
GitToolBox|エディタ内各コードのコミット履歴を表示する。

VSCodeでお世話になっていた一部の拡張機能の代替品。
入れておいて得しかない。

# 2. 機能
## 2.1. 検索・置換

機能|操作
---|---
ファイル検索|Command + Shift + O (後述のShift2回からでも可能)
ファイル(アクティブな)内の文字列検索 or 置換|Command + F or R
複数ファイル内の文字列検索 or 置換|Command + Shift + F or R <br>複数ファイル内の置換で、置換対象を絞りたい場合は以下のようにするといい<br>・「複数ファイル内置換」ポップアップの「プロジェクト内」「モジュール」「ディレクトリ」タブを切り替えて絞る<br>・「ファイルマスク」で、特定の名前を持つファイルだけに絞る
複数ファイルに対する検索(検索の区分は様々)|``Shift2回``から 以下、区分を選択して検索<br>・型: 型定義の場所を検索するとき<br>・ファイル: ファイル名で検索するとき<br>・シンボル: 関数・メソッド定義の場所を検索すとき<br>※部分一致でインスタント検索してくれる。例えばファイルとして``xxx/yyy/zzz.go``的なものがある場合、``xx/yy/z``の検索ワードくらいでもいい感じにヒットするはず

## 2.2. コードジャンプ

機能|操作
---|---
関数、メソッド、型、変数 etc.の定義箇所へジャンプ or 使用箇所へジャンプ|Command + クリック
一つ前に操作していた箇所へジャンプ|Command + [ <br>※作業中タブ開きすぎて収集つかなくなった & ファイル名もよく覚えてないときに。
インターフェース定義内のメソッドの実装箇所へジャンプ|エディタ枠外の「I」アイコンをクリック

## 2.3. テストコードの実行

テスト対象|操作
---|---
ファイル or ディレクトリ内ファイルすべて | テスト実行対象をプロジェクトツリー内で右クリック > 実行 > go test xxx
テストコードファイル内のテスト関数全体 or 一部テストケース| 実行したい箇所でエディタ枠外に表示される▶をクリック > 実行 or デバッグ 
直前に実行したテスト | Control + R

## 2.4. 補完
エディタで文字列入力中に補完候補があるとサジェストしてくれる。
サジェストの選択肢で``Enter``を押下すると「挿入」、``Tab``を押下すると「文末まで上書き」という操作になる(状況に応じて判断すること)。

### ライブテンプレート
サジェストの選択肢の中には「ライブテンプレート」のものもある。
以下、**Goのコーディングをしていたら頻出するであろう「for(range利用)」, 「append」, 「エラーハンドリング」のライブテンプレート** を利用する方法。


前提として、以下のようなスライスが存在しているものとする
```
xxxList := make([]string,  0)
```

**for**: エディタ上で``xxxList.forr``と打つと以下のようなコードを自動入力してくれる
```
for i, xxx := range xxx.List {
}
```

**append**: エディタ上で``xxxList.aapend``と打つと以下のようなコードを自動入力してくれる
```
xxxList = apend(xxxList, )
```

**エラーハンドリング**: エディタ上で``err``と打つと以下のようなコードを自動入力してくれる

```
if err != nil {
}
```

なお、ライブテンプレートはPreferences > エディター > ライブテンプレート から、自分で作って登録することもできる。

### GitHub Copilot
GitHub Coplilotのプラグインをインストールすると使えるようになる。
コード書いてる最中にしばらく待つと、これ書きたいんやろ？という感じで、エディタ上にうすーい文字でサジェストしてくれる。
そのサジェストを適用したいならば、Tabを押下すればOK。
テストコードを書いたり、ゲッターメソッドを追加してる場面でなかなかの精度でサジェストしてくれるのでめちゃくちゃ便利。
日本語のコメントを書くと、それに従うようなコードもかなりの精度で出してくれる。
**使用が許可されているのであれば、絶対にいれるべきプラグイン。**

---

## 2.5. 構造体関連の便利機能
構造体の``{}``内にカーソルあわせて``Option + Enter``を押下すると、色々と便利なことが行える。
個人的には、テストコードを書くときにめちゃくちゃ使う。

- 全フィールド値を明示的にゼロ埋め
- フィールドに構造体を含む場合、そちらもあわせて全フィールドを明示的に再帰的にゼロ埋め
- 複数行へ全フィールドを配置
- 1行に全フィールドを配置

**例. 全フィールド値を明示的にゼロ値で全埋め**

```
type Xxx struct {
  A int
  B string
}
```
という構造体があったとき、``Xxx{}``まで入力した後、カッコ内にカーソルあわせて``Option + Enter``を押下して「全てのフィールドを埋める」を選択すると、以下のようにゼロ値で埋めてくれる。
```
Xxx{
    A: 0,
    B: "",
}
```

※当然ではあるが、対象の構造体のフィールドに対してアクセス可能な状況(unexportedなフィールド or exportedなフィールドで同一パッケージとか)でないと使えない

## 2.6. リファクタリング
対象の名前を変更したいときや、別ファイルへ切り出したい時に、すでに対象を利用している箇所の依存関係を考慮しながら安全に変更を加えることができる機能。

``対象を右クリック > リファクタリング > 任意の選択肢を選択する``
で実行。以下主に使う選択肢。

選択肢|説明
---|---
シグネチャーの変更|※対象が関数/メソッド名でないと表示されない選択肢である。<br>関数/メソッドの引数を追加・変更・削除できる。特に、引数を追加したときには、デフォルト値をあわせて設定できる。デフォルト値は、Railsのデフォルト引数とはイメージが異なり、「関数/メソッドの呼び出し元で変更前には、変更後の引数が存在しなかった場合、設定したデフォルト値を与えて呼び出すように修正してくれる」というもの。
名前の変更|対象の名前を安全に置換できる。ただし、同名の箇所すべてを置換するため、他ファイルに影響が出る可能性あり。
移動|対象を安全に別ファイルへ移動できる。コメントもいい感じにひっついてきて、単なるコピペではできない「パッケージ名の変更およびimport文の追加」も自動でやってくれる。移動先は、移動先として指定したファイルの末尾になる。


## 2.7. その他
### ニッチだけど自分には刺さった機能

- **ファイルを開いたときに、プロジェクトツリーでそのファイルの箇所まで移動した状態にする**
``プロジェクトウィンドウの設定ボタン > 開いているファイルを常に選択にチェック``

- **「コミット」領域に表示されているファイル(=差分があるもの)をエディタ領域に通常状態で表示する**
``コミット領域のファイルを選択 > Command + ↓ ``

### 正規表現を使った複数ファイル内の置換(置換対象外の文字列を除外したい場合)
- 検索パターン文字列の設定：【部分マッチパターン1】([^【ノイズとなる文字を並べる】])【部分マッチパターン2】
- 置換後の文字列の設定： 【置換後の部分文字列1】$1【置換後の部分文字列2】

例.
`AaaBbbCcc` は `ZzzAaaBbbCcc`へ置換したいけど、`AaaBbbCcc【ホニャララ】`は置換したくないとき・

- 検索パターン文字列の設定: AaaBbbCcc([^【ホニャララな正規表現】])        
- 置換後の文字列設定: ZzzAaaBbbCcc$1

※ホニャララな正規表現は、例えば  `_a-zA-Z`  とか。置換される箇所のリストを確認して、正規表現を調整していくといい。

# 3. あとがき
GoLandはすごく多機能なので、最大限使おうとするともっと色々調べる必要がある。
が、正直この記事で紹介したプラグイン・機能で開発効率的には満足してる。

(とはいえ、今後これすげぇわ・・・！という機能を見つけたら、またこの記事を更新していく)