Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【Golang】goimportsでプロジェクト配下のimport文すべてをパッケージ種類別に整形する

TL;DR

下記コマンドで、カレントディレクトリ配下のすべての .go ファイルの import 文を整形してくれる。

$ find . -print | grep --regex '.*\.go' | xargs goimports -w -local "github.com/your/package"

goimports-w オプションでファイルを直接書き換える。
また -local <string> は指定した string を prefix にもつパッケージの整形済み import 文の上部に、他の整形済み import 文が置かれる。
すなわち、string が prefix の import 文のかたまりが最後にくるようになる。

よって、import 文整形順は 標準パッケージ -> Publicパッケージ -> 自パッケージ の順となる。

あとは、find . -print | grep --regex '.*\.go' で引っ掛けた .go ファイル全てに上記 import 整形を適用する。

example

before

import (
    "fmt"
    "github.com/rennnosuke/gih/domain/model/entity"
    "github.com/rennnosuke/gih/domain/service/git/issue"
    "github.com/urfave/cli/v2"
    "regexp"
    "strconv"
    "unicode/utf8"
)

after

import (
    // 標準パッケージ
    "fmt"
    "regexp"
    "strconv"
    "unicode/utf8"

    // Publicパッケージ
    "github.com/urfave/cli/v2"

    // 自パッケージ
    "github.com/rennnosuke/gih/domain/model/entity"
    "github.com/rennnosuke/gih/domain/service/git/issue"
)

参考 : goimports

Go は標準でソースの import 文を整形するツール goimports を提供している。
goimports を Go ソースファイルに実行することで、ソースをコンパイルするのに必要なパッケージの import 文を自動挿入したり、インデントを追加したり、不要な import 文を削除してくれる。

before

package main

func main() {
    s1 := "Hello"
    s2 := "goimports."
    s := strings.join(s1, s2, ",")
    fmt.Println(s)
}
$ goimports -w main.go

after

package main

import (
    "fmt"
    "strings"
)

func main() {
    s1 := "Hello"
    s2 := "goimports."
    s := strings.Join(s1, s2, ",")
    fmt.Println(s)
}

参考文献

goimports - GoDoc