LoginSignup
5
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-30

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
}
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5