Edited at

ジェネレートしたコードを整形する

More than 3 years have passed since last update.

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
}