go框架gin自定义和增强*gin.Context的方法 --使用闭包函数将自定义Context handler转换为 gin.HandlerFunc

在使用gin框架进行开发的时候,我们可以通过自定义gin.Context来实现和增强gin框架,方法也很简单,关键就2个步骤, 1是继承gin.Context, 2是在路由的时候对函数入参类型进行转换,下面为具体的方法:

1. 自定义一个结构体,然后以匿名的方式继承*gin.Context

package ginximport ("github.com/gin-gonic/gin"
)// 自定义一个本地结构体,然后以匿名方式继承*gin.Context
// @author: tekintian <tekintian@gmail.com>
type XContext struct {*gin.Context // 匿名继承 *gin.Context
}

上面为自定义的结构体 XContext里面以匿名方式继承了 *gin.Context, 这样我们就可以在本地将我们需要增强的功能绑定到XContext对象上了,在使用的时候我们可以通过我们自定义的结构体访问gin.Context中的所有可内容,同时也可以访问我们自定义的方法。  

这里有一个小知识点就是结构体匿名继承的访问方式有2种,1是通过继承对象访问,2是通过继承对象.被继承结构体名称访问(匿名继承的结构体默认会有一个名称即结构体的名称)

在我们自定义的XContext上面绑定我们自己的方法示例:

获取get或者post的查询参数

package ginximport ("github.com/gin-gonic/gin"
)// 自定义一个本地结构体,然后以匿名方式继承*gin.Context
// @author: tekintian <tekintian@gmail.com>
type XContext struct {*gin.Context // 匿名继承 *gin.Context
}// 获取string类型的查询参数 支持GET POST  如果key不存在则返回默认值defaultVal
func (c *XContext) QueryStr(key string, defaultVal ...string) string {var defVal stringif len(defaultVal) > 0 {defVal = defaultVal[0]}v, ok := c.GetQuery(key)if !ok {v, ok = c.GetPostForm(key)}if ok {return v}return defVal
}

2. 使用闭包将自定义XContext转换为 *gin.Context

*gin.Context 的使用都是在路由对应的handlerFunc里面, 我们只需要将我们自定义的context放到路由handlerFunc里面即可, gin默认的路由handlerFunc定义是这样的  type HandlerFunc func(*Context)  , 我们自定义的XContext的handlerFunc的入参就会是这样 func(c  *XContext) ,  

XHandlerFunc 函数的作用就是初始化我们自定义的对象XContext和转换为gin路由需要的HandlerFunc 

package ginximport ("github.com/gin-gonic/gin"
)// XHandlerFunc闭包函数, 实现gin.Context到自定义 XContext 的转换。
func XHandlerFunc(handler func(c *XContext)) func(ctx *gin.Context) {// 闭包函数return func(c *gin.Context) {// 这里的Context是匿名继承的结构体的默认名称(结构体本身的名称),// 如果XContext中没有其他字段,这个也可以写成 &XContext{c}handler(&XContext{Context: c})}
}

3. 使用自定义gin.Context (XContext)示例

使用就比较简单了,就是在路由定义的时候使用即可。

package mainimport ("fmt""gotms/global/ginx""github.com/gin-gonic/gin"
)// 注意这里的 入参c是我们自定义的XContext
func hello(c *ginx.XContext) {name:=c.QueryStr("name","Tekin") // 使用我们自定义的XContext中的方法c.JSON(200, gin.H{"msg": fmt.Sprintf("Hello %v", name),})
}func main() {r := gin.Default()// 注意这里的路由对应的handlerFunc需要使用我们的闭包函数进行初始化和转换r.GET("/hello", ginx.XHandlerFunc(hello))r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

总结:

gin.Context是gin框架中最重要的一个对象,这个里面包含了所有gin框架http服务的内容,我们通过自定义一个结构体以匿名方式继承gin.Context 这样即可不修改gin框架,又可以实现自己想要的功能, 这种方式可以应用在其他任何的第三方库或者框架里面,这里的关键就是自定义对象的初始化和转换,掌握了这个方法可极大的提升我们的开发效率。

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

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

相关文章

压缩pdf文件大小,压缩pdf文件大小软件哪个好

在数字化时代&#xff0c;PDF文件因其卓越的跨平台兼容性和稳定性而成为工作与学习的好帮手。然而&#xff0c;当PDF文件体积过大时&#xff0c;传输和存储便成了一项挑战。别担心&#xff0c;本文将为你揭秘如何快速压缩PDF文件&#xff0c;让你的文档轻装上路&#xff01; 压…

postman请求访问:认证失败,无法访问系统资源

1、使用postman时&#xff0c;没有传入相应的token&#xff0c;就会出现这种情况&#xff0c;此时需要把token放进去 发现问题: { "msg": "请求访问&#xff1a;/getInfo&#xff0c;认证失败&#xff0c;无法访问系统资源", "code": 401 } 1…

从美图类场景,看火山引擎数据飞轮如何赋能产品增长

伴随移动移动互联网发展以及手机拍摄能力提升&#xff0c;美图类APP已成为人们手机中常见的应用之一。根据广发证券发展研究中心《数字媒体行业AI系列报告&#xff1a;美图类APP&#xff0c;商业模式逐渐清晰&#xff0c;AIGC加速付费心智培养》显示&#xff0c;从行业整体流量…

Python中序列化利器pickle使用详解

✨前言&#xff1a; &#x1f31f;什么是pickle&#xff1f; Python 中的 pickle 模块是一个序列化和反序列化Python对象结构的工具&#xff0c;也就是说它可以把Python中任意一个对象转化为一串字节流&#xff0c;也可以将这串字节流重新恢复为原来的对象。这个过程也分别被…

Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言1. Monorepo 和 MultiRepo 简介2. 为什么选择 Monorepo&#xff1f; 二、Monorepo 和 MultiRepo 的区别1. 定义和概述2. 各自的优点和缺点3. 适用场景 三、Monorepo 的开发策略1. 版本控制2. 依赖管理3. 构建和发布…

python-切片、集合

序列是指&#xff1a;内容连续、有序&#xff0c;可使用下标索引的一类数据容器 序列的常用操作 - 切片 切片的语法 序列的常用操作 - 切片 注意切片的范围是左闭右开 为什么使用集合 集合的常用操作 - 修改 集合的常用操作 - 集合长度 集合常用功能总结 集合的特点

程序员鱼皮的写简历指南(保姆级)2、简历优化

大家好&#xff0c;我是程序员鱼皮。做知识分享这些年来&#xff0c;我看过太多简历、也帮忙修改过很多的简历&#xff0c;发现很多同学是完全不会写简历的、会犯很多常见的问题&#xff0c;不能把自己的优势充分展示出来&#xff0c;导致措施了很多面试机会&#xff0c;实在是…

AI时代来临,程序员如何应对AI挑战?

随着 AI 技术的飞速发展&#xff0c;特别是大模型的出现&#xff0c;传统的程序员角色正在经历深刻的变革&#xff0c;AI 已经对现有的软件开发模式和程序员的工作模式造成了冲击&#xff0c;并且大语言模型在某些特定语言内的表现甚至超过了大部分的程序员。 但人工智能没有情…

深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看

在CNN的学习过程中我会提供相应的手算例子帮助理解训练过程。 其他关于神经网络的学习链接如下&#xff1a; 一、了解卷积神经网络 卷积神经网络的作用 总的来说&#xff0c;卷积神经网络的第一个主要作用是对图像进行特征提取&#xff0c;所谓特征提取&#xff0c;就是明白…

java入门-基础语法(运算符)

运算符是对变量、字面量进行运算的 符号 &#xff08;一&#xff09;基本的算术运算符、符号做连接符 &#xff08;1&#xff09;基本运算符&#xff1a;(加)&#xff0c; - &#xff08;减&#xff09;、 * &#xff08;乘&#xff09;、 / &#xff08;除&#xff09;、%&…

Nginx 的详细介绍,包括其特点、安装、配置、应用场景及最佳实践

Nginx 是一款高性能的 HTTP 和反向代理服务器&#xff0c;同时也是一个 IMAP/POP3/SMTP 代理服务器。它由俄罗斯人伊戈尔赛索耶夫&#xff08;Igor Sysoev&#xff09;开发&#xff0c;并于 2004 年首次公开发布。Nginx 以其轻量级、高并发、稳定性强等特点&#xff0c;在 Web …

有哪些好的 Stable Diffusion 提示词(Prompt)可以参考?

Docker 作图咒语生成器 docker-prompt-generator 是一个开源项目&#xff0c;可以利用模型反推出提示词&#xff0c;让你偷偷懒&#xff0c;无需琢磨怎么写prompt&#xff0c;只需要找一个差不多的模型反推一下&#xff0c;直接用就好了&#xff0c;支持支持 MidJourney、Stab…

linux中的进程以及进程管理

程序和进程的区别和联系 程序&#xff08;Program&#xff09;&#xff1a; 程序是一组指令的集合&#xff0c;通常存储在磁盘或其他存储设备上&#xff0c;是一种静态的概念。程序本身并没有运行&#xff0c;它只是一个可执行的文件或脚本&#xff0c;包含了一系列的指令和数…

42、nginx之nginx.conf

nginx----web服务器 一、nginx http就是apache&#xff0c;在国内很少。 nginx是开源的&#xff0c;是一款高性能&#xff0c;轻量级的web服务软件。 稳定性高&#xff0c;而且版本迭代比较快&#xff08;修复bug速度比较快&#xff0c;安全性快&#xff09; 消耗系统资源…

uni-app打包小程序的一些趣事~

前言 Huilderx版本&#xff1a;4.15 uni-app Web端版本&#xff1a;3.4.21 问题1 Web端/APP端样式好好的&#xff0c;打包微信小程序就乱了咋整&#xff1f; 使用::v-deep/::deep/deep(){}都是没用滴~~ 原因&#xff1f; 解决&#xff1a; <script lang"ts"…

python小练习04

三国演义词频统计与词云图绘制 import jieba import wordcloud def analysis():txt open("三国演义.txt",r,encodingutf-8).read()words jieba.lcut(txt)#精确模式counts {}for word in words:if len(word) 1:continueelif word "诸葛亮" or word &q…

《昇思25天学习打卡营第06天|网络构建》

网络构建 神经网络模型由神经网络层和Tensor操作构成 #实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.…

Python作用域及其应用

Python的作用域规则决定了变量在代码中的可见性和访问性。全局作用域中定义的变量可以在整个程序中访问&#xff0c;而局部作用域中定义的变量则只能在其被创建的函数或代码块中访问。 全局作用域与局部作用域 全局作用域中的变量通常在程序的顶层定义&#xff0c;可以被整个…

RK3568驱动指南|第十五篇 I2C-第183章 SMBus总线介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

商业模式的6大要素,新零售起盘策划公司,顶层设计方案服务商

在当今的商业世界中&#xff0c;企业通过不同的商业模式来实现自身的发展和利润。下面介绍六种常见的商业模式。 坐标&#xff1a;厦门&#xff0c;我是易创客肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 1、互联…