网站推广软件免费版大全运城市网站建设

diannao/2025/10/26 14:28:10/文章来源:
网站推广软件免费版大全,运城市网站建设,重庆企业建站公司,wordpress获取作者信息不知道大家在使用 Gin 构建 API 服务时有没有这样的问题:参数绑定的环节可不可以自动处理#xff1f;错误可不可以直接返回#xff0c;不想写空 return, 漏写就是 bug本文通过简单地封装#xff0c;利用 go 的接口特性#xff0c;提供一个解决上述两个问题的思路一、解决过…不知道大家在使用 Gin 构建 API 服务时有没有这样的问题:参数绑定的环节可不可以自动处理错误可不可以直接返回不想写空 return, 漏写就是 bug本文通过简单地封装利用 go 的接口特性提供一个解决上述两个问题的思路一、解决过程1.1 刚开始时写 API 服务时我们刚开始使用 Gin 写 API 服务时一般会按照官方文档上的 这么写// User 用户结构 type User struct {UserName string }// CreateUser 创建用户 func CreateUser(ctx *gin.Context) {var params Userif err : ctx.ShouldBind(params); err ! nil {ctx.JSON(http.StatusBadRequest, gin.H{code: 400,msg: 参数错误,})logrus.Errorf(params err, %v, params)return}// 一些其他的业务逻辑 ...ctx.JSON(http.StatusOK, gin.H{code: 0,msg: 创建成功,}) }func main() {r : gin.Default()r.POST(user, CreateUser)if err : r.Run(:8080); err ! nil {logrus.Fatalf(can not start serve: %v, err)} } 1.2 封装返回值我们写了一段时间之后会发现我们的返回值的结构是固定的为什么不抽象一下呢所以我们创建了一个结构体 Resp 并且封装了两个方法用于成功和失败这两种状态的返回// resp.go// Resp 返回 type Resp struct {Code intMsg stringData interface{} }// ErrorResp 错误返回值 func ErrorResp(ctx *gin.Context, code int, msg string, data ...interface{}) {resp(ctx, code, msg, data...) }// SuccessResp 正确返回值 func SuccessResp(ctx *gin.Context, msg string, data ...interface{}) {resp(ctx, 0, msg, data...) }// resp 返回 func resp(ctx *gin.Context, code int, msg string, data ...interface{}) {resp : Resp{Code: code,Msg: msg,Data: data,}if len(data) 1 {resp.Data data[0]}ctx.JSON(http.StatusOK, resp) } 添加这个方法之后我们再看一下 CreateUser 这个方法成功的从 16 行变到了 12 行// main.go // CreateUser 创建用户 func CreateUser(ctx *gin.Context) {var params Userif err : ctx.ShouldBind(params); err ! nil {ErrorResp(ctx, 400, 参数错误)logrus.Errorf(params err, %v, params)return}// 一些其他的业务逻辑 ...SuccessResp(ctx, 创建成功) } 1.3 两个痛点上面的方法还不够完整我们还是有许多重复的逻辑可以发现我们在写的绝大多数 API 大概都是这样参数绑定 校验业务逻辑返回这里面有两个痛点参数绑定的环节可不可以自动处理错误可不可以直接返回不想写空 return, 漏写就是 bug // 不想写大量这种重复的代码var params Userif err : ctx.ShouldBind(params); err ! nil {// 下面这三行是不是可以合并成一行ErrorResp(ctx, 400, 参数错误)logrus.Errorf(params err, %v, params)return} 1.4 使用接口封装请求上面的这两个痛点我们可以通过一个辅助函数解决// Requester 请求 type Requester interface {Request(ctx *gin.Context) (*Resp, error) }// Handle 请求 func Handle(r Requester) gin.HandlerFunc {return func(ctx *gin.Context) {resp, err : request(r, ctx)if err ! nil {var code *errcode.Errorif !errors.As(err, code) {code errcode.Unknown.Wrap(err)}resp Resp{Code: code.Code,Msg: code.String(),}_ ctx.Error(err)}ctx.JSON(http.StatusOK, resp)} }func request(r Requester, ctx *gin.Context) (*controller.Resp, error) {// 参数绑定if err : ctx.ShouldBind(r); err ! nil {return nil, errcode.ErrParams.Wrap(err)}return r.Request(ctx) } 这样我们只需要实现这个 Requester, 写 API 时只需要关注业务逻辑就可以了// CreateUser 创建用户 type CreateUser struct {UserName string }func (u *User) Request(ctx *gin.Context) (*Resp, error) {// 业务逻辑// 返回成功值 }func main() {r : gin.Default()r.POST(user, Handle(CreateUser))if err : r.Run(:8080); err ! nil {logrus.Fatalf(can not start serve: %v, err)} } 上面的代码有一个 bug 不知道大家发现没有我们上一次请求的参数会被带到下一次请求当中// Handle 请求 func Handle(r Requester) gin.HandlerFunc {return func(ctx *gin.Context) {// 创建一个新的 Requester, 避免将上一次的参数带到下一次当中if reflect.TypeOf(r).Kind() ! reflect.Ptr {panic(must be a pointer)}req : reflect.New(reflect.ValueOf(r).Elem().Type()).Interface().(Requester)resp, err : request(req, ctx)if err ! nil {var code *errcode.Errorif !errors.As(err, code) {code errcode.Unknown.Wrap(err)}resp Resp{Code: code.Code,Msg: code.String(),}_ ctx.Error(err)}ctx.JSON(http.StatusOK, resp)} } 二、总结大概这样差不多就 ok 了还有很多可以完善的点这里有一些思路有的已经做了有的还在路上每次注册都写 Handle(CreateUser) 还是有点麻烦?可以封装一下 gin.IRouter 这个接口这样注册接口就可以和原来一样了2. 参数绑定如果我需要多次绑定怎么办?可以添加一个接口如果实现了这个接口就执行以下对于有特殊的参数校验之类的也可以采用类似的方式处理 type Binder interface {Bind(ctx *gin.Context) error}func request(r Requester, ctx *gin.Context) (*controller.Resp, error) {// 参数绑定if err : ctx.ShouldBind(r); err ! nil {return nil, errcode.ErrParams.Wrap(err)}// 其余参数绑定if b, ok : r.(Binder); ok {if err : b.Bind(api); err ! nil {return nil, errcode.ErrParams.Wrap(err)}}return r.Request(ctx)} 3. 怎么输出 API 文档可以和 swagger 之类的 API 文档结合, 利用 go generate 自动生成顺便可以连接口注册都不用了添加一行注释自动注册接口并且输出接口文档 // Router put /api/v1/userfunc(u *User) Request(ctx *gin.Context) (*Resp, error) 4. 能不能减少 CURD 代码?可以实现只需要采用约定的项目接口可以 利用 go generate 直接自动生成简单的 CURD 代码博客原文Go Web 小技巧一简化Gin接口代码​lailin.xyz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自助建站 知乎seo引擎

一、数组 在 solidity 中,数组分为定长数组和动态数据,这两者的定义上跟 golang 很相似;其定长数组在创建好后不能设置超过数组长度的值,也就是不能push;而动态数组允许 push,还有一点很有意思的是&#x…

响应式网站导航栏内容会员卡管理系统怎么制作

Python是一种高级、通用、解释型的编程语言,具有简洁、易于阅读和理解的语法。以下是Python中常用的语法: 变量定义和赋值: variable value输出内容: print("Hello, World!")条件判断: if condition:# 条件…

成都网站建站公司凉山建设网站

今天推荐一个可以快速开发 ChatGPT UI 界面的组件库,质量很高,拿来就能用。 Lobe UI 是由 lobehub 团队开发的一套 web UI 组件库,和我之前推荐的很多通用型的 UI 组件库不同,Lobe UI 是专门为目前火热的 AIGC 应用开发而打造&am…

产品宣传网站开发seo工具在线访问

原文Understanding ‘*’, ‘*args’,’**‘and’**kwargs’ 刚开始学习python的时候,对有关args,kwargs,*和**的使用感到很困惑。相信对此感到疑惑的人也有很多。我打算通过这个帖子来排解这个疑惑(希望能减少疑惑)。 让我们通过以下5步来理解: 通过…

网站建设 div怎么用门户网站的推广

Federation 具备的数据转发功能类似, Shovel 够可靠、持续地从一个 Broker 中的队列 ( 作为源端,即source)拉取数据并转发至另一个 Broker 中的交换器 ( 作为目的端,即 destination) 。作为源端的队列和作为目的端的交换器可以同时位于…

制作网站网络科技公司介绍产品的营销推文

在采用分库分表设计时,通过一个PartitionKey根据散列策略将数据分散到不同的库表中,从而有效降低海量数据下C端访问数据库的压力。这种方式可以缓解单一数据库的压力,提升了吞吐量,但同时也带来了新的问题。对于B端商户而言&#…

平面设计师长逛的网站有哪些兼职做ppt是哪个网站

看这篇前请先把我上一篇了解一下:深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 前言: 相信很多学习数据结构的人,都会遇到一种情况,就是明明最一开始学习就学习了时间复杂度,但是在后期…

曲靖网站建设网站建设辶金手指排名十三

我今天要讨论的功能是Java EE 6中的事件机制。一般的想法是触发一个事件,并让事件监听器来接收它。 我创建了这个完全没有用的示例,但是它的简单性帮助我专注于重要的内容。 我将从后备操作中触发LogEvent,该事件将记录到java.util.Logger中。…

现在做什么网站好wordpress内存高

在Android应用开发中经常要用各种控件&#xff0c;并为控件设置其背景颜色&#xff0c;使用各种不同的颜色为控件着色是很有必要的。 在Android系统中&#xff0c;各种颜色与其对应的码制如下所示&#xff1a; <resources> <color name"white">#ffffff…

俄语免费网站制作安徽六安房价

本文共514个字&#xff0c;预计用时2分钟小伙伴们&#xff0c;今天给大家分享一个小软件&#xff0c;名字叫做 EyeCareApp&#xff0c;中文名&#xff1a;护眼软件EyeCareApp是一款能够调节屏幕亮度的软件&#xff0c;它可以调整屏幕亮度&#xff0c;滤除蓝光&#xff0c;有效减…

在外国做玄幻小说网站手帐风格wordpress主题

原生应用&#xff1a;OpenAI™ChatGPT、Baidu.Inc™文心一言 也可以体验CSDN的INSCODE AI&#xff0c;集成多个国内GPT内容。 文章目录 前言----编程语言的未来&#xff1f;一、编程语言的教育1.1 学校所见所闻1.2 开启我们的Ai行程~io&#xff01;1.3 Ai结果评论 二、Ai编程教…

做网站模板用什么软件许昌市网站建设

编程思维&#xff0c;对于一个开发人员来说是必备的&#xff0c;但凡能让应用跑起来&#xff0c;不管应用的大小&#xff0c;优劣&#xff0c;说明这个开发人员都具有编程思维&#xff0c;毕竟程序认可了这个开发人员逻辑&#xff0c;能启动起来。小到几行代码&#xff0c;一个…

福永论坛网站建设百度关键词搜索指数

Linux系统编程&#xff08;八&#xff09;线程一、什么是线程&#xff1f;二、Linux内核线程实现原理线程共享资源线程非共享资源线程优缺点线程控制原语一、什么是线程&#xff1f; LWP&#xff1a;light weight process 轻量级的进程&#xff0c;本质仍是进程(在Linux环境下…

襄阳大型网站建设网站装修用什么软件做

目录 1 前言2 符号及作用&#xff1a;3 绘制清晰的ER图步骤4 实体关系图的用途5 使用场景6 实际应用场景举例7 结语 1 前言 当谈到数据库设计与分析的核心工具时&#xff0c;实体关系图&#xff08;ER图&#xff09;无疑是其中最重要的一环。在软件开发、信息管理以及数据库设…

长治网站制作的流程如何提高网站速度

Nginx服务器证书部署发布时间&#xff1a;2018-01-17 16:15:25依赖建议l SSL卸载驱动。建议&#xff1a;openssl版本1.1.0f。l nginx版本Stable version&#xff1a;最新稳定版&#xff0c;生产环境上建议使用的版本。获取证书MPKI方式&#xff1a;1. 登录https://mpki.tru…

个人网站建站指南网络工程是什么

项目任务&#xff1a;老师通过老师身份登录并查看博客园作业 1、背景&#xff1a; ①典型用户&#xff1a;老师 &#xff08;1&#xff09;名字&#xff1a;王老师 &#xff08;2&#xff09;年龄&#xff1a;27以上 &#xff08;3&#xff09;收入&#xff1a;5000以上 &#…

外贸soho建站多少钱荣耀手机官方旗舰店

运算符的优先级和结合性 优 先 级 运 算 符 含 义 运算对象个数 结合方向 1 () 圆括号 自左向右 [] 下标运算符 −> 指向结构体成员运算符 . 结构体成员运算符 2 ! 逻辑非运算 1&#xff08;单目&#xff09; 自右向左 &#xff5e; 按位取反…

网站开发音乐金寨县建设局网站

文章目录总览一. 诞生、概念和作用二. 分类三. 外中断的处理过程四. 导图总结总览 异常&#xff1a;内中断 一. 诞生、概念和作用 早期计算机&#xff0c;程序只能串行执行&#xff0c;资源利用率低&#xff08;详可见OS 发展分类&#xff09;&#xff0c;为了解决这一问题…

网站建设与网站设计wordpress臃肿吗

简介 在几天前的.NET 8发布会上&#xff0c;来自微软的Glenn Condron和David Fowler为我们演示了.NET Aspire&#xff0c;在Visual Studio的帮助下&#xff0c;它展现出了惊人的开发效率。 短短的十分钟内&#xff0c;David现场演示了如何轻松创建了一个具有服务发现&#xf…

网站动态和静态济南h5网站建设

PNP技术是由Microsoft提出的&#xff0c;英文Plug and play的缩写&#xff0c;中译即插即用&#xff0c;意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序&#xff0c;做到插上就能用&#xff0c;无须人工干预&#xff0c;是Windows自带的一项技术。所谓即插即用是指将…