Goctl 的代码生成着实有意思,提高效率的利器啊,忍不住扒了下原码,记录如下:
原代码不上了,以 main.go 的生成为例,相关的文件路径如下:
../goctl/api/gogen/main.tpl
../goctl/api/gogen/util.go 其中核心函数:genFile(c fileGenConfig) error
简单说,生成代码要3步:1.写个模板文件(.tpl);2.模板文件埋点;3.填充埋点
自己写了个 demo:
code.tpl:
Go
package {{.pkgName}}
import (
{{.imports}}
)
type {{.logic}} struct {
ctx context.Context
}
func New{{.logic}}(ctx context.Context) *{{.logic}} {
return &{{.logic}}{
ctx: ctx,
}
}
generate.go
Go
package gen
import (
"bytes"
goformat "go/format"
"os"
"project_demo/docker/demo01/util"
"text/template"
)
var (
codeTempFile = "./gen/code.tpl"
outPutFile="./gen/code.go"
Params map[string]interface{}
)
const regularPerm = 0o666
func GenCode() {
bt, err := os.ReadFile(codeTempFile)
util.CheckError(err)
// imports:=make([]string,0)
// cimport:=`"context"`
// imports=append(imports,cimport)
Params=map[string]interface{}{
"pkgName":"gen",
"imports":`"context"`,
"logic":"TestTemplate",
}
temp, err := template.New("code").Parse(string(bt))
util.CheckError(err)
buffer := new(bytes.Buffer)
err= temp.Execute(buffer, Params)
util.CheckError(err)
formatOutput, err := goformat.Source(buffer.Bytes())
util.CheckError(err)
buffer.Reset()
buffer.Write(formatOutput)
os.WriteFile(outPutFile,buffer.Bytes(),regularPerm)
}
输出如下:code.go:
Go
package gen
import (
"context"
)
type TestTemplate struct {
ctx context.Context
}
func NewTestTemplate(ctx context.Context) *TestTemplate {
return &TestTemplate{
ctx: ctx,
}
}