当前位置: 首页 > article >正文

go-zero(五) 模板定制

go-zero 模板定制

goctl 代码生成是基于 go 的模板去实现数据驱动的,实际开发中,使用goctl 生成的代码,并不符合我们的需求。

例如,我们刚刚的使用错误管理,我们需要在handler中返回的错误信息。

一、生成模板

首先,我们需要初始化模板文件。通过运行goctl template init 命令,可以将模板文件下载到本地。

sql2pb>goctl template init -home ./
  • home 是存储模板的路径

执行命令后,指定目录中会生成以下文件和文件夹结构:

├─api
├─docker
├─gateway
├─kube
├─model
├─mongo
├─newapi
└─rpc

这些目录对应了go-zero中不同模块的模板,提供了服务生成的基本结构。

二、修改模板

这里我们演示如何修改handler.tpl模板,以便在处理请求时返回更合适的错误信息。

打开handler.tpl文件,可以看到生成的代码框架。我们将在处理请求时引入新的错误处理逻辑,使其更符合业务需求。以下是修改后的模板代码:

package {{.PkgName}}

import (
	"net/http"
	xhttp "github.com/zeromicro/x/http"  //导入zeromicro库
	"github.com/zeromicro/go-zero/rest/httpx"
	{{.ImportPackages}}
)

{{if .HasDoc}}{{.Doc}}{{end}}
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.ErrorCtx(r.Context(), w, err)
			xhttp.JsonBaseResponseCtx(r.Context(), w, err)
			return
		}

		{{end}}l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx)
		{{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})
		if err != nil {
			//httpx.ErrorCtx(r.Context(), w, err)
			xhttp.JsonBaseResponseCtx(r.Context(), w, err)
		} else {
			{{if .HasResp}}xhttp.JsonBaseResponseCtx(r.Context(), w, resp){{else}}httpx.Ok(w){{end}}
		}
	}
}

修改说明

  • 我们使用了 xhttp.JsonBaseResponseCtx 方法来返回错误信息,这样可以确保客户端得到统一风格的错误响应。
  • 处理请求的逻辑保留了原有结构,但在错误处理的方式上作了调整,以更好地符合业务需求。

自定义规则:

  • 在 goctl 提供的有效数据范围内修改,即不支持外部变量
  • 不支持新增模板文件
  • 不支持变量修改

三、根据模板生成代码

完成模板的修改后,可以使用 goctl命令来生成新代码。以下是命令示例:

goctl api go --api user.api --dir ./  --home ../sql2pb    

--home 指定我们刚刚下载的模板路径, 默认值为 ${HOME}/.goctl

在代码生成完成后,我们可以查看生成的 handler 文件,以确认我们的修改是否成功。新的 handler 文件应当能够根据我们自定义的模板返回整洁的错误响应。
在这里插入图片描述


http://www.kler.cn/a/403140.html

相关文章:

  • 如何提升编程能力第二篇
  • 【Flink】快速理解 FlinkCDC 2.0 原理
  • MacOS系统上Jmeter 录制脚本遇到的证书坑位
  • Spring源码(十三):Spring全系列总结
  • Day 26
  • TEA加密逆向
  • Jquery实现jsonview
  • Java算法OJ(7)随机快速排序
  • vue3:scss引用
  • stm32————重映射基础知识点(PWM呼吸灯实验)
  • 模型压缩——训练后剪枝
  • windows安装redis, 修改自启动的redis服务的密码
  • Vue3 组件 view-shadcn-ui 2024.4.0 发布
  • 解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件
  • AWTK-WIDGET-WEB-VIEW 实现笔记 (2) - Windows
  • 阻尼Newton方法-数值最优化方法-课程学习笔记-5
  • 沃丰科技出海客服解决方案:为中国企业出海保驾护航
  • 第二十周:机器学习
  • WPF下 DataGrid加入序号列
  • STM32 | 超声波避障小车
  • 认识c++(c++入门)
  • 理解 Python 中的 __getitem__ 方法:在自定义类中启用索引和切片操作
  • 机器视觉相机重要名词
  • 建立独一无二的GitHub Profile
  • 很能体现FPGA硬件思维的一道面试题
  • docker的logs命令可以查看docker容器日志