从 PHP 到 AI + Golang,程序员自救转型手记(四十六):再次优化基类 这是一个系列 Blog作者将以一个 PHP 全栈工程师的身份利用 AI 工具claude code、codex、deepseek、豆包等从零开始学习 golang 语言并最终完成 ai-go-admingithub | gitee开源项目的制作全程记录分享。在上一期我们进行了 “前端远程下拉输入组件”本期将完成再次优化基类再次优化基类基类严格来讲不是 go 里边的概念在本 blog 中使用它范指 基控制器、基服务、基仓储列表数据有序保证很多项目都没有做这个甚至都不知道这个概念这其实是一个数据库含 PostgreSQL、MySQL使用的小坑在未指定排序子句ORDER BY时数据库并不保证排序即先查到哪行就输出哪行且不保证多次相同查询中的数据输出顺序也就是说只要是列表查询开发者必需传递ORDER BY子句如果不传递你看的有序只是临时的下次未必还是这个顺序这在分页等场景可能是灾难性的。实践中我们以用户传递的排序字段优先如果没有传递默认读取主键字段做有序保证且就算有传递排序字段依旧以主键字段托底即可防止用户排序字段值有一样的此时又会丢失有序保证。基控制器封装 BuildSerOpts 方法用于构建服务层选项数据比如Get方法现在组装服务层选项是这样写的entity,err:h.svc.Get(c,service.Options{Omit:h.cfg.Omit.Get,Select:h.cfg.Select.Get,PrimaryKey:c.Param(pk),})增加BuildSerOpts方法后可以简化为opts:h.BuildSerOpts(c,Get,Request{PrimaryKeyValue:c.Param(pk),})entity,err:h.svc.Get(c,opts)即无需再单独传递Omit和Select选项而且在List方法中收益更大代码可以由原来的7行改为单行opts : h.BuildSerOpts(c, List, req.Request)。基类增加自定义扩展参数解析函数目前我们可以为基类配置OmitFields各动作的 Omit 黑名单字段、SelectFields设置各动作的 Select 白名单字段、Adapter数据适配器。以上都是固定的参数但在实际业务场景中很多时候需要能够向底层传递一些自定义的扩展参数规划如下仓储层与自定义扩展参数无关最多传递到服务层即可服务层额外接受一个Extension的Options类型为any增加参数后完整的Options如下// Options 通用服务操作选项// 每个方法所需要的选项都可以在此找到但并非每个方法都会使用全部的选项typeOptionsstruct{OmitFields[]string// 排除出入库字段会传递给仓储层的 Omit 方法SelectFields[]string// 选择出入库字段会传递给仓储层的 Select 方法Wheres[]Where// 查询条件用于构建 WhereScopes然后传递给仓储层的 Scopes 方法SortFieldstring// 排序字段用于构建 OrderScopeSortOrderstring// 排序方式Pageint// 页码用于构建 PaginateScopeLimitint// 每页条数PrimaryKeyValuestring// 主键值目前可供 Get、Update 方法获取数据行PrimaryKeyValues[]string// 主键切片目前可供 Delete 方法批量删除行Extension any// 任意自定义扩展参数}控制器层不仅仅是接受一个Extension any更合理的方式是接受一个函数ExtensionResolver func(c *gin.Context) any可以将它称之为扩展数据解析器函数返回值将被赋值给服务层的Extension any直接于之前增加的BuildSerOpts构建服务层选项数据方法中调用一下解析器再赋值即可。以上是需求描述也是给 AI 的提示词Blog 会比实际发送的更加详细很多AI 帮忙实现以上需求后我特意实际使用了一下比如我们需要向服务层传递一个自定义的AdminSession参数又不想重写控制器层的方法首先在服务层定义好结构体字段列表和类型完全自定义// AuthAdminRuleExtension 规则列表扩展参数typeAuthAdminRuleExtensionstruct{AdminSession*dto.AdminSession}控制器handler.NewHandler时额外使用WithExtension传递一个扩展数据解析器即可// NewAuthAdminRuleHandler 创建菜单和权限规则管理控制器实例funcNewAuthAdminRuleHandler(svc*svcAuth.AuthAdminRuleService)*AuthAdminRuleHandler{returnAuthAdminRuleHandler{Handler:handler.NewHandler(svc,// 传递 扩展数据解析器handler.WithExtension(func(c*gin.Context)any{returnsvcAuth.AuthAdminRuleExtension{// 传递 AdminSessionAdminSession:middleware.GetAdmin(c),}}),),svc:svc,}}服务层读取和使用扩展数据// 从控制器传来的 管理员信息 扩展数据extension,ok:opts.Extension.(*AuthAdminRuleExtension)if!ok||extension.AdminSessionnil{returnnil,errors.New(参数错误缺少 AdminSession 扩展数据)}// opts.xxxx 参数基本每个方法都有接受// 此时就可以使用 extension.AdminSession 了Create 默认忽略传递的主键字段入库我们已经设计了OmitFields选项用于配置忽略入库的字段但是执行创建动作时主键字段总是应该被忽略我们在很早之前就写好了获取当前模型主键的方法这里直接配合它在未设定 OmitFields 选项时默认忽略掉主键字段。

相关新闻

最新新闻

每日一句 | “Too precious while being held“ 是什么梗?从抱猫学英语

每日一句 | “Too precious while being held“ 是什么梗?从抱猫学英语

引言最近看到一句很有意思的英文:“Too precious while being held”。如果只看字面,可能会翻译成“被抱着的时候太珍贵了”,但这到底是什么意思呢?意思是:被抱着的时候太珍贵了今天我们就来聊聊这句简短却充满画面感的…

2026/8/2 6:41:21
突破AI工具限制:本地部署Claude Code代码助手完整指南

突破AI工具限制:本地部署Claude Code代码助手完整指南

1. 项目概述:从一则“禁令”看AI工具生态的暗流涌动最近,一个颇具戏剧性的标题在技术圈里流传开来:“特朗普下令:白宫全面封杀Claude!”。当然,这并非一则真实的行政命令,而更像是一个技术社区里…

2026/8/2 6:41:21
5-数据库-SQL注入-报错注入-day13

5-数据库-SQL注入-报错注入-day13

MySQL 报错注入 — 原理与注入流程 ⚠️ 免责声明:本文旨在教学网络安全知识,帮助开发者理解SQL注入漏洞原理及防御方法。所有技术内容仅用于授权测试和安全研究,严禁用于任何非法攻击或未经授权的渗透测试。读者应遵守法律法规,因…

2026/8/2 6:41:21
我做了一款给独居长辈用的 iPhone App:从需求到上架

我做了一款给独居长辈用的 iPhone App:从需求到上架

正文 做这个 App 的起点,不是一个宏大的创业故事,而是一个很普通的家庭问题:子女和父母不住在一起时,怎样知道他们今天还好,同时又不把关心变成反复追问? 电话当然最直接,微信也足够普及。但电…

2026/8/2 6:41:21
丹东来客企业简介

丹东来客企业简介

丹东来客科技有限公司2026年2月于辽宁丹东正式成立,由云澜科技(丹东)有限公司全资控股。公司核心团队常年深耕AI数字化营销赛道,实战与研发经验深厚。早在母公司运营阶段,团队便启动GEO全域AI优化系统研发,…

2026/8/2 6:41:21
Deflate算法深度解析:从LZ77与哈夫曼编码原理到工程实战调优

Deflate算法深度解析:从LZ77与哈夫曼编码原理到工程实战调优

1. 项目概述:为什么我们需要重新审视Deflate在数据存储和传输的世界里,压缩算法就像一位沉默的幕后英雄。你可能每天都在和它打交道,却很少意识到它的存在——从你下载的ZIP压缩包,到浏览网页时加载的PNG图片,再到HTTP…

2026/8/2 6:36:21