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

Gin简介(Go web基础知识)

Gin简介

https://geektutu.com/post/quick-go-gin.html我是从这个网站上面摘录的,就是做个笔记,仅分享。膜拜极客兔兔大佬

Go特性:

  • 快速:路由不使用反射,基于Radix树,内存占用少。

  • 中间件:HTTP请求,可先经过一系列中间件处理,例如:Logger,Authorization,GZIP等。这个特性和 NodeJs 的 Koa 框架很像。中间件机制也极大地提高了框架的可扩展性。

  • 异常处理:服务始终可用,不会宕机。Gin 可以捕获 panic,并恢复。而且有极为便利的机制处理HTTP请求过程中发生的错误。

  • JSON:Gin可以解析并验证请求的JSON。这个特性对Restful API的开发尤其有用。

  • 路由分组:例如将需要授权和不需要授权的API分组,不同版本的API分组。而且分组可嵌套,且性能不受影响。

  • 渲染内置:原生支持JSON,XML和HTML的渲染

  • 安装 Gin

go get -u -v github.com/gin-gonic/gin

-v:打印出被构建的代码包的名字
-u:已存在相关的代码包,强行更新代码包及其依赖包

第一个Gin程序

package mainimport "github.com/gin-gonic/gin"func main() {r := gin.Default()/*使用gin.Default()生成了一个实例,这个实例就是一个接口标准——WSGIWSGI是就是一个接口标准,用于实现Web应用程序和服务器之间的通信*/r.GET("/", func(c *gin.Context) { //声明一个路由,告诉什么样的URL能触发传入的函数//这个函数返回我们想要显示在用户浏览器的信息c.String(200, "Hello,Geektutu")})r.Run() //让应用运行在本地服务器上
}

路由(ROUTE)

路由方法有 GET, POST, PUT, PATCH, DELETEOPTIONS,还有Any,可匹配以上任意类型的请求。

获取Query参数,就是URL的一部分

$ curl "http://localhost:9999/users?name=Tom&role=student"
Tom is a student
r.GET("/user",func(c *gin.Context){
name := c.Query("name")//对于name参数role := c.DefaultQuery("role","teacher")//对于role参数,如果没有,默认teacherc.String(http.StatusOK,"%s is a %s",name,role)
})

获取POST参数

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()/*使用gin.Default()生成了一个实例,这个实例就是一个接口标准——WSGIWSGI是就是一个接口标准,用于实现Web应用程序和服务器之间的通信*/r.POST("/form", func(c *gin.Context) {username := c.PostForm("username")password := c.DefaultPostForm("passwoed", "000000")//获取表单上的password参数,如果参数不存在,就是用默认值0000000c.JSON(http.StatusOK, gin.H{"usernaem": username,"password": password,}) //返回一个JSON响应/*http.StatusOK是一个常量,表示HTTP响应状态码中的成功状态,这个状态码表示服务器成功处理了请求*/})
}

Query 和 POST混合参数

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()/*使用gin.Default()生成了一个实例,这个实例就是一个接口标准——WSGIWSGI是就是一个接口标准,用于实现Web应用程序和服务器之间的通信*/r.POST("/posts", func(c *gin.Context) {id := c.Query("id")page := c.DefaultQuery("page", "0")username := c.PostForm("username")password := c.DefaultPostForm("password", "000000")c.JSON(http.StatusOK, gin.H{"id": id,"page": page,"username": username,"password": password,})})/*gin.H 是 Gin 框架中的一个类型,它是一个简化版的 map[string]interface{},通常用于构造 HTTP 响应中的 JSON 数据。gin.H 类型允许您以一种更简洁的方式构建键值对,用于构建 JSON 响应。*/
}

Map参数(字典参数)

r := gin.Default()/*使用gin.Default()生成了一个实例,这个实例就是一个接口标准——WSGIWSGI是就是一个接口标准,用于实现Web应用程序和服务器之间的通信*/r.POST("/post", func(c *gin.Context) {ids := c.QueryMap("ids")names := c.PostFormMap("names")c.JSON(http.StatusOK,gin.H{"ids": ids,"names": names,})})

重定向

r.GET("/redirect", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "/index")})r.GET("/goindex", func(c *gin.Context) {c.Request.URL.Path = "/"r.HandleContext(c)//对请求重新处理})

分组路由

这样就更好管理

在 Gin 框架中,您可以使用分组路由来将一组相关的路由归类到同一个路由组中,这样可以更好地组织和管理路由。

以下是如何在 Gin 中使用分组路由的示例:

goCopy codepackage mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 创建一个路由组v1 := router.Group("/v1"){v1.GET("/users", func(c *gin.Context) {c.JSON(200, gin.H{"message": "GET /v1/users"})})v1.POST("/users", func(c *gin.Context) {c.JSON(200, gin.H{"message": "POST /v1/users"})})}// 创建另一个路由组v2 := router.Group("/v2"){v2.GET("/users", func(c *gin.Context) {c.JSON(200, gin.H{"message": "GET /v2/users"})})v2.POST("/users", func(c *gin.Context) {c.JSON(200, gin.H{"message": "POST /v2/users"})})}router.Run(":8080")
}

在这个示例中,我们创建了两个路由组 “/v1” 和 “/v2”,每个路由组都包含了一组相关的路由。例如,“/v1/users” 和 “/v2/users” 分别是两个路由组中的路由。这样做可以更好地组织和管理不同版本或不同功能的路由。

r := gin.Default()//处理器函数:defaultHandlerdefaultHandler := func(c *gin.Context){c.JSON(http.StatusOK,gin.H{"path":c.FullPath(),})}//group :v1v1 := r.Group("/v1"){v1.GET("/posts",defaultHandler)v1.GET("/series",defaultHandler)}v2:=r.Group("/v2"){v2.GET("/post",defaultHandler)v2.GET("/series",defaultHandler)}
//只是首先进行分组,处理的时候还是到处理器函数

上传文件

单个文件

r := gin.Default()r.POST("/upload1", func(c *gin.Context) {file, _ := c.FormFile("file")/*获取名为“file”的文件*/c.String(http.StatusOK,"%s uploaded!",file.Filename)})

多个文件

	r := gin.Default()r.POST("/upload2", func(c *gin.Context) {//Multipart formform, _ := c.MultipartForm()/*获取表单中的多部份表单数据*/files := form.File["upload[]"] //获取名为"upload[]"的多个上传文件对象//遍历文件对象列表for _,file := range files{log.Println(file.Filename)}c.String(http.StatusOK,"%d files uploaded!",len(files))})

HTML模板

func main() {r := gin.Default()r.LoadHTMLGlob("C:\\Users\\Lenovo\\GolandProjects\\gin\\day_23\\template")stu1 := &student{Name: "Geektutu", Age: 20}stu2 := &student{Name: "Jack", Age: 22}r.GET("/arr", func(c *gin.Context) {c.HTML(http.StatusOK, "arr.html", gin.H{"title":  "Gin","stuArr": [2]*student{stu1, stu2},})})/*当用户访问/arr路径的时候,会执行该函数在函数内部,我们会渲染名为“arr.html”的HTML模板文件,并且传递模板所需的数据*/
}

感觉现在也解决不了这个问题,运行不了!算了算了

中间件

中间件可以接收 HTTP 请求对象和响应对象,并进行处理。通常,一个中间件会做一些预处理,然后将请求传递给下一个中间件或处理器函数。类似地,在响应阶段,中间件可能会修改响应对象,然后将其传递给下一个中间件或返回给客户端。

r := gin.Default()//作用于全局r.Use(gin.Logger())r.Use(gin.Recovery())//这些中间件将在每个请求处理之前都被调用//作用于单个路由r.GET("/benchmark", MyBenchLogger(), benchEndpoint)// MyBenchLogger()中间件被应用到了benchEndpoint路由上//作用于某个组authorized := r.Group("/")authorized.Use(AuthRequired()){//AuthRequired()中间件被应用到名为authorized的路由组上authorized.POST("/login", loginEndpoint)authorized.POST("/submit", submitEndpoint)}

相关文章:

Gin简介(Go web基础知识)

Gin简介 https://geektutu.com/post/quick-go-gin.html我是从这个网站上面摘录的,就是做个笔记,仅分享。膜拜极客兔兔大佬 Go特性: 快速:路由不使用反射,基于Radix树,内存占用少。 中间件:HT…...

HBase的Bulk Load流程

目录 1. 数据准备 2. 文件移动 3. 加载数据 4. Region处理 5. 元数据更新 6. 完成加载 7. 清理 8. 异常处理 LoadIncrementalHFiles(也称为Bulk Load)是HBase中一种将大量数据高效导入到HBase表的机制。以下是LoadIncrementalHFiles的主要流程步…...

vue中图片替换 遇到问题

问题&#xff1a; 在img标签里动态绑定路径&#xff1a;<img v-bind:src"imgSrc" /> data里这样写是错误的&#xff1a;imgSrc:xx/xx.png 这样渲染的路径会有问题&#xff0c;导致出不来图片 解决了 是这样的 data(){return(){imgSrc:require("../…...

Android 观察者模式

在Android中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09;是一种常用的设计模式&#xff0c;用于在对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。在Android开发中&#xff0…...

阿里云部署MySQL、Redis、RocketMQ、Nacos集群

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容MySQL集群配置云服务器选购CPU选择内存选择云盘选择ESSD AutoPL云盘块存储性能&#xff08;ESSD&#xff09; 镜像选择带宽选择密码配置注意事项 安装docker和docker-compose部署MySQL三主六从半同步集群一主二从同步集群规…...

day05-店铺营业状态设置

1. Redis入门 1.1 Redis简介 Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网&#xff1a; https://redis.io 中文网&#xff1a; https://www.redis.net.cn/ 主要特点&#xff1a; 基于内存存储&#xff0c;读写性能高…...

哈希表(c++)

1、介绍 哈希表&#xff0c;也称为散列表&#xff0c;是一种非常高效的数据结构。它通过将键&#xff08;Key&#xff09;映射到数组的特定位置来快速查找、插入和删除数据。这个映射过程由哈希函数&#xff08;Hash Function&#xff09;完成&#xff0c;该函数将键转化为一个…...

C#基础-标识符命名规则

目录 1、标识符定义 2、遵循规则 3、标识符的例子 4、MSDN中英文解释 英文...

Zabbix Web界面中文汉化

要想达到上图的效果&#xff0c;第一步先查看 /usr/share/zabbix/assets/fonts/ [rootservice yum.repos.d]# ll /usr/share/zabbix/assets/fonts/ 总用量 0 lrwxrwxrwx. 1 root root 33 3月 23 16:58 graphfont.ttf -> /etc/alternatives/zabbix-web-font 继续查看graph…...

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)

arduino ide 开发工具 arduino版本&#xff1a;1.8.19 arduino ide 中文设置&#xff1a;​ file >> preferences >> ​ arduino IDE 获取 ESP32 开发环境&#xff1a;打开 Arduino IDE &#xff0c;找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…...

Spring Boot从入门到实战

课程介绍 本课程从SpringBoot的最基础的安装、配置开始到SpringBoot的日志管理、Web业务开发、数据存储、数据缓存&#xff0c;安全控制及相关企业级应用&#xff0c;全程案例贯穿&#xff0c;案例每一步的都会讲解实现思路&#xff0c;全程手敲代码实现。让你不仅能够掌Sprin…...

Spring Boot(七十一):整合RateLimiter实现接口限流

1 简介 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证。如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证。一旦获取到许可证,不需要再释放许可证。 RateLimiter使用的是一种叫令牌桶的流控算法,RateLimiter会按照一定的频率…...

通过jsDelivr实现Github的图床CDN加速

最近小伙伴们是否发现访问我的个人博客http://xiejava.ishareread.com/图片显示特别快了&#xff1f; 我的博客的图片是放在github上的&#xff0c;众所周知的原因&#xff0c;github访问不是很快&#xff0c;尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床&…...

Kafka系列之:Connect 中的错误报告

Kafka系列之:Connect 中的错误报告 Kafka Connect 提供错误报告来处理各个处理阶段遇到的错误。默认情况下,转换期间或转换中遇到的任何错误都会导致连接器失败。每个连接器配置还可以通过跳过此类错误、选择性地将每个错误以及失败操作的详细信息和有问题的记录(具有各种详…...

MySQL面试题--开发(最全,涵盖SQL基础、架构、事务)

MySQL面试题--事务https://mp.csdn.net/mp_blog/creation/editor/136947072 MySQL面试题--MySQL内部技术架构https://blog.csdn.net/Timebro/article/details/136946046?spm1001.2014.3001.5501 MySQL面试题--最全面-索引https://blog.csdn.net/Timebro/article/details/136…...

【移动端】Flutter 获取Android AMap实例

背景 本文的背景&#xff0c;是因为我在开发高德地图时&#xff0c;需要自定义高德比例尺位置和样式&#xff1b;但结果查看了AMap Flutter插件和AMap SDK源码后&#xff0c;发现AMap无法添加自定义MyMethodCallHandler的实现类&#xff01; why&#xff1f; 源码 在Flutte…...

什么是PLC物联网关?PLC物联网关有哪些功能?

在数字化浪潮的推动下&#xff0c;工业物联网&#xff08;IIoT&#xff09;正逐步成为推动制造业智能化转型的关键力量。而在这一变革中&#xff0c;PLC物联网关扮演着至关重要的角色。今天&#xff0c;就让我们一起走进PLC物联网关的世界&#xff0c;了解它的定义、功能&#…...

R-CNN笔记

目标检测之R-CNN论文精讲&#xff0c;RCNN_哔哩哔哩_bilibili 论文背景 在该论文提出之前&#xff0c;主流的目标检测思路是&#xff1a; 将一幅图片划分成很多个区域&#xff0c;单独提取出来 对于每个区域使用传统的特征提取方法提取 提取结束后可以使用以为特征向量表示 可以…...

uni-app从零开始快速入门

教程介绍 跨端框架uni-app作为新起之秀&#xff0c;在不到两年的时间内&#xff0c;迅速被广大开发者青睐和推崇&#xff0c;得益于它颠覆性的优势“快”&#xff0c;快到可以节省7套代码。本课程由uni-app开发者团队成员亲授&#xff0c;带领大家无障碍快速掌握完整的uni-app…...

Springboot集成jersey打包jar找不到class处理

环境 java17 springboot 3.x 如题&#xff0c;简单来说&#xff0c;jersey官方希望用户通过 register 的方式&#xff0c;将所有的资源类注册到jersey中&#xff0c;但是&#xff0c;一般开发中&#xff0c;可能定义了N个Resource类&#xff0c;一个一个的加入&#xff0c;太…...

别再死记硬背UART帧格式了!用Arduino UNO和逻辑分析仪,5分钟带你‘看见’数据流

别再死记硬背UART帧格式了&#xff01;用Arduino UNO和逻辑分析仪&#xff0c;5分钟带你‘看见’数据流 记得第一次接触UART通信时&#xff0c;对着教科书上的帧格式图发呆了半小时——起始位、数据位、校验位、停止位&#xff0c;这些概念就像天书一样。直到有一天&#xff0c…...

关于wokwi运行程序出错,而实机运行正常的问题

## 先说结论&#xff1a; # 由于wokwi的时间流速和现实不一致&#xff0c;所以rtos的调度可能会有一点差异&#xff0c;导致一些“逻辑有问题但是时序正好能运行”的代码时序改变&#xff0c;然后挂掉了。可以通过backtraceaddr2line寻找出错代码&#xff0c;然后检查逻辑解决#…...

精选6款智能论文工具,支持AI降重与语言优化,有效降低重复率。

开头总结工具对比&#xff08;技能4&#xff09; &#xfffd;&#xfffd; 为帮助学生们快速选出最适合的AI论文工具&#xff0c;我从处理速度、降重效果和核心优势三个维度&#xff0c;对比了6款热门网站&#xff0c;数据基于实际使用案例&#xff1a; 工具名称 处理速度 降…...

阿里云新用户专享:手把手教你用CentOS 7搭建《我的世界》PaperSpigot服务器(含端口配置与后台运行)

阿里云新用户专享&#xff1a;CentOS 7搭建《我的世界》高性能服务器全攻略 第一次在云服务器上搭建《我的世界》服务器时&#xff0c;我被各种专业术语和命令行操作搞得晕头转向。直到发现阿里云新用户的优惠活动&#xff0c;才意识到原来用不到一顿火锅的钱就能拥有专属游戏…...

Pixel Couplet Gen惊艳案例:游戏公司用Pixel Couplet Gen做乙巳年IP联动

Pixel Couplet Gen惊艳案例&#xff1a;游戏公司用Pixel Couplet Gen做乙巳年IP联动 1. 项目背景与创意来源 在数字娱乐产业快速发展的今天&#xff0c;游戏公司越来越注重通过文化元素与用户建立情感连接。某知名游戏公司为了庆祝乙巳年春节&#xff0c;决定打破传统春联的呈…...

OpenClaw智能家居中枢:Qwen3-14b_int4_awq语音指令转API调用

OpenClaw智能家居中枢&#xff1a;Qwen3-14b_int4_awq语音指令转API调用 1. 为什么需要本地化智能家居中枢 去年冬天的一个深夜&#xff0c;我被空调突然停止运行的嗡嗡声惊醒。摸索手机查看米家App时&#xff0c;发现服务器维护导致云端控制失效。这次经历让我意识到&#x…...

为什么Logisim-Evolution是数字电路学习的最佳选择?

为什么Logisim-Evolution是数字电路学习的最佳选择&#xff1f; 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 在数字逻辑的世界里&#xff0c;你是否曾为理解抽象的逻辑…...

ArcGIS数据处理必备技能:从地理坐标到UTM投影的面转栅格完整流程

ArcGIS数据处理必备技能&#xff1a;从地理坐标到UTM投影的面转栅格完整流程 当你第一次尝试在ArcGIS中将面矢量数据转换为栅格时&#xff0c;可能会遇到一个令人困惑的现象——无论怎么设置&#xff0c;输出的栅格像元大小总是显示为0.00几的极小数值。这不是软件bug&#xf…...

Exegol未来展望:AI驱动的安全测试与云原生架构的发展趋势

Exegol未来展望&#xff1a;AI驱动的安全测试与云原生架构的发展趋势 【免费下载链接】Exegol Fully featured and community-driven hacking environment 项目地址: https://gitcode.com/gh_mirrors/ex/Exegol Exegol作为一个功能全面且社区驱动的网络安全测试环境&…...

手机摄影党必看!用Flare7K数据集原理改善夜间拍摄(华为/iPhone实测)

手机摄影党必看&#xff01;用Flare7K数据集原理改善夜间拍摄&#xff08;华为/iPhone实测&#xff09; 夜间拍摄时&#xff0c;你是否经常遇到这样的困扰&#xff1a;路灯变成模糊的光团&#xff0c;霓虹灯周围出现奇怪的彩虹条纹&#xff0c;或是画面中突然多出几条不明来源的…...