go-zero(五) 模板定制

server/2024/11/20 17:25:33/

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.ppmy.cn/server/143508.html

相关文章

鸿蒙实战:使用隐式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建LuzhouAbility2.4 创建Luzhou页面2.5 设置模块配置文件 3. 测试效果4. 实战总结 1. 实战概述 本次鸿蒙应用实战,先创建项目“ImplicitWantStartAbility”,接着修改In…

SSL/TLS协议简介

目录 1 概述 2 主要功能 3 技术演化 3.1 明文时代 3.2 对称加密时代 3.3 非对称加密时代 3.4 公证时代 2.5 SSL/TLS协议时代 4 组件协议 4.1 握手协议(Handshake Protocol) 4.2 加密协议(Record Protocol) 4.3 警报协…

MATLAB 使用教程 —— 常用函数

字符串strmatch 函数:字符串匹配 存在性exist 函数:检查是否存在isfield 函数:检查结构体中是否存在特定字段 文件相关fileparts 函数:分解文件路径fullfile 函数:构建完整文件路径 字符串 strmatch 函数:…

数据结构(单向链表——c语言实现)

链式存储的优缺点: 优点: 1、动态分配内存: 链式存储不需要在数据插入之前分配固定大小的数组或内存块,因此它更适合存储动态变化的数据 2、高效的插入和删除操作: 在链表中插入或删除元素只需要调整相邻节点的指…

昇腾系列双处理边缘计算盒子DA500I,打造高效低延迟的视觉推理解决方案

随着深度学习模型在机器视觉领域的持续优化,目标检测、识别和分类能力显著提升,对计算硬件提出了更高要求。深度学习任务需要大量计算资源,特别是在边缘设备上,单一处理器盒子如CPU在处理矩阵运算和图像分析时效率较低&#xff0c…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

基于YOLOv8深度学习的智慧城市管理井盖状态检测系统(PyQt5界面+数据集+训练代码)

本研究设计并实现了一种基于YOLOv8深度学习的智慧城市管理井盖状态检测系统,旨在提高城市井盖管理的效率与安全性,减少因井盖缺失或损坏而可能带来的安全隐患。井盖作为城市基础设施的重要组成部分,其状态直接关系到行人和车辆的安全。传统的…

C# 超链接控件LinkLabel无法触发Alt快捷键

在C#中,为控件添加快捷键的方式有两种,其中一种就是Windows中较为常见的Alt快捷键,比如运行对话框,记事本菜单等。只需要按下 Alt 框号中带下划线的字母即可触发该控件的点击操作。如图所示 在C#开发中,实现类似的操作…