Goのコードをジェネレートするツールを作ってて、でっち上げたGoのコードを整形したい、ついでにimportも自動挿入したいみたいなケース。
フォーマットしたい
gofmtした状態のコードを吐きたい。標準パッケージgo/formatを使う。
- テンプレートなどからジェネレートされたコードに無駄な空行・空白文字のあっても綺麗にフォーマットされる。
コード
package main
import (
"fmt"
"go/format"
)
func main() {
code := `package foo
func Bar() {
var a int
var b bool
var c string
}`
formatted, err := format.Source([]byte(code))
if err != nil {
panic(err)
}
fmt.Println(string(formatted))
}
結果
フォーマットされたコードが得られる。
package foo
func Bar() {
var a int
var b bool
var c string
}
importも自動挿入したい
goimportsした状態のコードを吐きたい。golang.org/x/tools/importsパッケージを使う。
- ジェネレートしたコードが条件によってパッケージが必要だったり不要だったりする場合に便利。
- ただし、実行環境に対象のパッケージが存在しなかったら解決できない。
準備
go get しておく。
go get "golang.org/x/tools/imports"
コード
package main
import (
"fmt"
"golang.org/x/tools/imports"
)
func main() {
code := `package foo
func Bar() {
var a int
var b bool
var c time.Time
}`
imported, err := imports.Process("", []byte(code), nil)
if err != nil {
panic(err)
}
fmt.Println(string(imported))
}
imports.Process()
の第三引数には整形の為のオプション&imports.Options{}
を渡すことができる。
結果
import自動挿入とフォーマットされたコードが得られる。
package foo
import "time"
func Bar() {
var a int
var b bool
var c time.Time
}