go generate

26 Aug 2019

Daigo Ikeda

Knightso, LLC

Profile

Daigo Ikeda
@hogedigo

Knightso, LLC
http://www.knightso.co.jp/
Shizuoka, JAPAN

go generate とは

用途例

やってみよう

orerr generator

こんな構造体があったときに・・・

type Sample struct {
    Name string
}

orerr generator

こんな構造体を生成したい

type SampleOrErr struct {
    Sample Sample
    Error  error
}

orerr generator

仕様

orerr generator

Source:

package sample

//go:generate orerr -output sample_orerr.go .

// Sampe describes sample
// +orerr
type Sample struct {
    Name string
}

orerr generator

実行

go generate ./...

go generateに使える3rd partyライブラリ

stringer

stringer

go get golang.org/x/tools/cmd/stringer

integer定数を元にString関数(fmt.Stringer)を生成

stringer

package painkiller

//go:generate stringer -type=Pill

type Pill int

const (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
    Acetaminophen = Paracetamol
)

実行

go generate

stringer

同パッケージに下記コードが生成される

// Code generated by "stringer -type=Pill"; DO NOT EDIT.

package painkiller

import "fmt"

const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"

var _Pill_index = [...]uint8{0, 7, 14, 23, 34}

func (i Pill) String() string {
    if i < 0 || i >= Pill(len(_Pill_index)-1) {
        return fmt.Sprintf("Pill(%d)", i)
    }
    return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}

gen

gen

go get github.com/clipperhouse/gen

genericsライクな操作をサポートする

gen

Source:

//go:generate jwg -output sample_json.go .

// +gen slice:"Where,Count,GroupBy[string]"
type Sample struct {
    Name string
}

gen

Generate:

type SampleSlice []Sample

func (rcv SampleSlice) Where(fn func(Sample) bool) (result SampleSlice)

func (rcv SampleSlice) Count(fn func(Sample) bool) (result int)

func (rcv SampleSlice) GroupByString(fn func(Sample) string) map[string]SampleSlice

jwg

jwg

go get github.com/favclip/jwg/cmd/jwg

JSONフィールドをlowerCamelCaseにする

jwg

Source:

//go:generate jwg -output sample_json.go .

// +jwg
type Sample struct {
    Name string
}

jwg

Generate:

type SampleJSON struct {
    Name string `json:"name,omitempty"`
}

他にもSample←→SampleJSON相互変換用ユーティリティ関数などが生成される

qbg

qbg

go get -u github.com/favclip/qbg/cmd/qbg

GAE/Go Datastore Query Builder

qbg

Before:

q := datastore.NewQuery("User")
q = q.Filter("Name =", "ikeda")
_, err = q.GetAll(ctx, &users)

After:

qb := NewUserQueryBuilder()
qb.Name.Equal("ikeda")
_, err = qb.Query().GetAll(ctx, &users)

まとめ

まとめ

Thank you!

Thank you

26 Aug 2019

Daigo Ikeda

Knightso, LLC