Template customization
Overview
goctl code generation is go based on template to implement data drive. While currently goctl code generation meets some of the code successes, the template custom can enrich code generation.
Template instructions can be consulted goctl template
Sample
Scenes
Implementing unified body response, following:
{
"code": 0,
"msg": "OK",
"data": {} // ①
}
① Actual Response Data
tip
go-zero
generated code not handled
Preparation
我们提前在 module
为 greet
的工程下的 response
包中写一个 Response
方法,目录树类似如下:
greet
├── response
│ └── response.go
└── xxx...
Code:
package response
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
)
type Body struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data,omitempty"`
}
func Response(w http.ResponseWriter, resp interface{}, err error) {
var body Body
if err != nil {
body.Code = -1
body.Msg = err.Error()
} else {
body.Msg = "OK"
body.Data = resp
}
httpx.OkJson(w, body)
}
Edit handler
template
$ vim ~/.goctl/${goctl_version}/api/handler.tpl
Replace the template with the following
package handler
import (
"net/http"
"greet/response"// ①
{{.ImportPackages}}
)
func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
{{if .HasRequest}}var req types.{{.RequestType}}
if err := httpx.Parse(r, &req); err != nil {
httpx.Error(w, err)
return
}{{end}}
l := logic.New{{.LogicType}}(r.Context(), svcCtx)
{{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})
{{if .HasResp}}response.Response(w, resp, err){{else}}response.Response(w, nil, err){{end}}//②
}
}
① Replace with your realresponse
package name, information
② Custom Template Content
::tip 1. If you don't have~/.goctl/${goctl版本号}/api/handler.tpl
file you can initialize the template initialization commandgoctl template format in
initialize
:
:::
Compare the template before and after
- Modify before
func GreetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.Request
if err := httpx.Parse(r, &req); err != nil {
httpx.Error(w, err)
return
}
l := logic.NewGreetLogic(r.Context(), svcCtx)
resp, err := l.Greet(&req)
// 以下内容将被自定义模板替换
if err != nil {
httpx.Error(w, err)
} else {
httpx.OkJson(w, resp)
}
}
}
- Modified
func GreetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.Request
if err := httpx.Parse(r, &req); err != nil {
httpx.Error(w, err)
return
}
l := logic.NewGreetLogic(r.Context(), svcCtx)
resp, err := l.Greet(&req)
response.Response(w, resp, err)
}
}
Modify response body comparison before and after template
- Modify before
{
"message": "Hello go-zero!"
}
- Modified
{
"code": 0,
"msg": "OK",
"data": {
"message": "Hello go-zero!"
}
}
Template Custom Rules
- Modify within valid data range provided by goctl, i.e. external variables are not supported
- Adding template file is not supported
- Variable changes not supported