🐭

VScode: Golangにおけるformatterの設定

2022/09/28に公開

本記事のゴール

  • golangのformatterは"goreturns"
  • 自動保存した時にコードの自動整形
    この2つをゴールとします。

formatterの選定

CodeReviewComments

こちらにもある通り、"gofmt", または"goimports"の2択なのかなぁと思い調べてみると上位互換と思しき"goreturns"という選択肢があることに辿り着きました。
他にも"golines"というのも導入してみましたが、importに対する補完はなかったので、とりあえず"goreturns"の方が便利だと思い、導入してみました。

goreturnsの導入

参考: goreturns

  1. install
    go get -u go get -u github.com/sqs/goreturns

  2. 適当なファイルで試してみる
    CLI(ターミナル)で該当ファイルに対してgoreturnsを試してみて、コード整形が機能していれば第1段階クリアです。(オプションを付けないと標準出力にコード整形後のコードが出力されます)

以下サンプル用ファイル

main.go
package main

func main() {



	
	fmt.Println("Hello, World")
				println("Hello!!")

}
$ goreturns main.go
package main

import "fmt"

func main() {

        fmt.Println("Hello, World")
        println("Hello!!")

}

自動でコード整形させる

ファイル保存時にコードを整形するようにします。
そのためにはVScodeの拡張機能の"Run on Save"をinstallします。

installしたら、その拡張機能の歯車から設定を開きます。
![](https://storage.googleapis.com/zenn-user-upload/a094c9a3761f-20220

開いたら"Edit in setting.json"を押します。
928.png)

setting.jsonに設定の雛形が開きますので、それを以下のように記述します。

setting.json
"emeraldwalk.runonsave": {
    "commands": [
      {
        "cmd": "goreturns -w ${file}",
        "match": "\\.go$"
      }
    ]
  },

ファイルが保存した時に、条件にマッチしたファイルに対してコマンドを適用させるというものです。

これでファイル保存(Ctrl + S、または自動保存)時に自動でコード整形が適用されます。

自動保存時に他の設定が適用されていない

自分はgolangに対してタブスペースを4に設定したりしてるのですが、それが保存の時に適用されていませんでした。
詳しい所は割愛しますが、VScodeにgolangのフォーマッター(Prettierなど)が対応していないため、明示的にデフォルトフォーマッターを指定する必要があるようです。

以下に一例として自分の設定を挙げておきます。

setting.json
"[go]": {
    "editor.defaultFormatter": "golang.go",
    "editor.formatOnPaste": false,
    "editor.formatOnSave": true,
    "editor.formatOnType": false,
    "editor.insertSpaces": false,
    "editor.tabSize": 4
  },

まとめ

調べて思ったのが全然導入の記事がないので思ったより時間かかったので、同じような人やメモも兼ねて書き記しておきます。
.goファイルのインデントもタブ2だったりタブ4だったりと定まっていないようですので、プロジェクトによって変更したりする必要もありそうでした。

今回はreturnsを導入しましたが、まだgolangを始めたばかりなのでベストプラクティスの情報に辿り着いていないので、もしgoreturnsを導入しようと思っている人がいたら参考にしてください。

Discussion