My External Storage

May 6, 2018 - 2 minute read - Comments - go vim

[vim-go]GoFillStructで構造体のフィールド初期化文を自動生成する

Goで構造体の初期化をするときに「フィールド名なんだっけ?」となることがある。 また、フィールド名を手打ちしてタイポすることもあるだろう。
vim-goを使っている場合、:GoFillStructコマンドで構造体のフィールド初期化を簡単に行うことができる。

フィールドを初期化する

TL;DR

  • vim-goの:GoFillStructコマンドを使うと、構造体のフィールド初期化を簡単にできる
  • vim-goのバージョンを1.15以上にする
  • 構造体の初期化宣言の上にカーソルを合わせて:GoFillStructコマンドを実行する

vim-goのバージョンを1.15以上にする

まずGoFillStructコマンドを使うにはvim-goのバージョンが1.15以上である必要がある。

https://github.com/fatih/vim-go/blob/7491209072ed4aa746e6fe7894f976ecd251801e/CHANGELOG.md#115---october-3-2017

FEATURES:
Add :GoFillStruct to fill a struct with all fields; uses fillstruct [GH-1443].

2017/10以前にvim-goをインストールしたままの場合はプラグインのアップデートを行う。
自分の場合はdein.vimを使っているので、以下のコマンドでプラグインのアップデートを行なった。

:call dein#update()

構造体の初期化宣言の上にカーソルを合わせて:GoFillStructコマンドを実行する

https://github.com/fatih/vim-go/blob/af32090927dd9ab92ba150f9b43a694338606200/doc/vim-go.txt#L837-L855

 :GoFillStruct
    Use `fillstruct` to fill a struct literal with default values. Existing
    values (if any) are preserved. The cursor must be on the struct you wish
    to fill.

vim-goのバージョンが問題ないならば、あとはそのまま利用することができる。
適当に初期化宣言を書いたあとにvimをノーマルモードにしてGoFillStructコマンドを実行する。
カーソルの位置がだいたい構造体の初期化宣言部分に合っていれば全てのフィールドの初期化文がデフォルト値で生成される。
既に一部フィールドの初期化宣言を記載済みでも利用することができる。

実際の動きをキャプチャしたものが以下になる。 Foo構造体とhttp.Client構造体のフィールド初期化をGoFillStructコマンドで行なった。

フィールドを初期化する

// Foo has two fields.
type Foo struct {
    StringField string
    IntField    int
}

// Before
func main() {
    foo := &Foo{StringField: "test"}
    c := &http.Client{}
}

// After GoFillStruct
func main() {
    foo := &Foo{
        StringField: "test",
        IntField:    0,
    }
    c := &http.Client{
        Transport:     nil,
        CheckRedirect: nil,
        Jar:           nil,
        Timeout:       0,
    }
}

終わりに

vim-goで出来る機能はだいたいvim-go Tutorialを読めばわかる。

https://github.com/fatih/vim-go-tutorial

GoFillStructコマンドはTutorialでフォローされていないので今回記事にした。 標準パッケージの構造体でこのコマンドを使うと「あ、これもフィールドで指定できたんだ」と気づくこともあり、一度覚えたあとはかなり多用している。

関連記事