go语言Gin框架的学习路线(六)

gin的路由器

Gin 是一个用 Go (Golang) 编写的 Web 框架,以其高性能和快速路由能力而闻名。在 Gin 中,路由器是框架的核心组件之一,负责处理 HTTP 请求并将其映射到相应的处理函数上。

以下是 Gin 路由器的一些关键特性和工作原理的简要解释:

  1. 路由注册:开发者可以在 Gin 中定义路由,这包括定义路径、HTTP 方法(GET、POST、PUT、DELETE 等)以及处理函数。路由注册是在应用启动时完成的。

  2. 路由匹配:当收到一个 HTTP 请求时,Gin 的路由器会根据请求的 URL 和 HTTP 方法来查找匹配的路由。

  3. 中间件支持:Gin 允许在路由上使用中间件,这些中间件可以在处理请求之前或之后执行一些操作,如日志记录、鉴权、跨域处理等。

  4. 路由分组:Gin 支持路由分组,这意味着你可以将一组相关的路由组织在一起,并为这组路由应用统一的中间件。

  5. 参数化路由:Gin 允许在路由中使用参数,这样可以通过 URL 传递动态值到处理函数。

  6. 路由模式:Gin 支持不同的路由模式,例如严格模式和非严格模式。在严格模式下,如果请求的 URL 与注册的路由不完全匹配,请求将不会被处理。

  7. 错误处理:Gin 提供了一种优雅的方式来处理路由中的错误,例如,如果找不到匹配的路由,Gin 会返回一个 404 错误。

  8. 路由性能:Gin 的路由性能非常高,因为它使用树状结构来匹配路由,这使得查找和匹配路由非常快速。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码解释

这段代码是一个使用 Gin 框架的 Go 语言 Web 应用的简单示例。下面是对代码中每个部分的解释:

  1. 导入包

    • "net/http" 是 Go 语言标准库的一部分,用于处理 HTTP 请求和响应。
    • "github.com/gin-gonic/gin" 是 Gin 框架的包,用于创建 Web 应用。
  2. main 函数

    • 这是程序的入口点,所有 Go 程序都从 main 函数开始执行。
  3. 创建路由实例

    • r := gin.Default() 创建了一个默认配置的 Gin 路由器实例。
  4. 定义路由

    • 使用 r.GETr.POSTr.PUT, 和 r.DELETE 方法定义了针对不同 HTTP 方法的路由。每个方法都关联到一个处理函数,该处理函数使用 gin.Context 来与请求和响应交互。
  5. 统一处理不同HTTP方法

    • r.Any("/other", ...) 定义了一个路由,它将匹配任何 HTTP 方法,并根据请求的方法返回不同的 JSON 响应。
  6. 无匹配路由的处理

    • r.NoRoute(...) 定义了当没有找到匹配的路由时的默认处理函数,它将返回一个 JSON 响应,其中包含 "method" 键和 "baidu.com" 作为值。
  7. 特定页面路由

    • 定义了 /shop/index 路由,当访问这个路径时,会返回包含 "msg" 键和 "/shop/index" 作为值的 JSON 响应。
  8. 路由组

    • 使用 r.Group 创建了一个路由组 videoGroup,这个组有一个公共的前缀 /video。在这个组内部,定义了三个 GET 路由,分别处理 /video/index/video/xx, 和 /video/oo 的请求。
  9. 启动服务器

    • r.Run(":8080") 启动了 Gin 服务器,监听 8080 端口,等待客户端的请求。
  10. 注释掉的代码

    • 有两段代码被注释掉了,分别是 /video/index 的 GET 路由和 /video 的路由组。注释掉的代码在程序中不会被执行。

这段代码展示了如何使用 Gin 框架来定义路由、处理不同的 HTTP 请求方法、创建路由组以及处理没有找到匹配路由的情况。通过这种方式,你可以构建一个具有不同页面和功能的 Web 应用。

gin中间键

在 Gin 框架中,中间件(Middleware)是一个非常重要的概念,它提供了一种在处理 HTTP 请求之前或之后执行代码的方式。中间件可以用于多种目的,比如日志记录、鉴权、跨域处理、请求限流等。

以下是对 Gin 中间件的一些关键点的解释:

  1. 定义中间件: 中间件通常是一个处理函数,它接收一个 *gin.Context 参数。*gin.Context 是 Gin 框架中的核心数据结构,它包含了请求和响应的数据,以及一些用于处理请求的方法。

  2. 使用中间件: 中间件可以在全局级别使用,也可以在特定路由或路由组上使用。使用 r.Use(middleware) 可以在所有路由上应用中间件;使用 r.GET("/path", middleware, handler) 可以在特定路由上应用中间件;使用 group.Use(middleware) 可以在路由组上应用中间件。

  3. 执行顺序: 中间件的执行顺序是按照它们被注册的顺序。如果一个请求匹配到一个路由,那么这个路由上注册的所有中间件将按顺序执行,然后是处理函数。

  4. 处理流程

    • 当一个请求到来时,Gin 首先执行注册在该请求路径上的所有中间件。
    • 如果中间件调用了 c.Next(),控制权会传递给下一个中间件或最终的处理函数。
    • 如果中间件没有调用 c.Next() 或者返回了一个错误,请求的处理流程将停止。
  5. 终止请求处理: 中间件可以通过调用 c.Abort() 来终止请求的处理流程。这通常用于鉴权失败或捕获到错误时。

  6. 错误处理: 中间件可以通过调用 c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"}) 来返回一个错误响应并终止请求处理。

  7. 访问请求和响应: 中间件可以访问和修改请求和响应的数据。例如,可以读取请求的头部信息、修改请求体、设置响应头等。

  8. 嵌套中间件: 中间件可以嵌套使用,一个中间件可以调用另一个中间件作为其处理逻辑的一部分。

  9. 自定义中间件: 开发者可以根据自己的需求编写自定义中间件,以实现特定的功能。

在这里插入图片描述
在这里插入图片描述

GORM

GORM 是一个流行的 Go 语言 ORM (对象关系映射) 库,它允许开发者使用 Go 语言的语法来操作数据库。以下是对 GORM 的一些关键点的解释:

  1. 对象关系映射

    • ORM 是一种编程技术,它将数据库中的数据表映射到程序中的对象。这意味着你可以使用对象的方式来操作数据库,而不需要编写大量的 SQL 语句。
  2. 数据库支持

    • GORM 支持多种数据库,包括 MySQL, PostgreSQL, SQLite, SQL Server 等。
  3. 模型定义

    • 在 GORM 中,你需要定义模型(Model),这通常是通过创建一个结构体来完成的。模型的结构定义了数据库表的列。
  4. 自动迁移

    • GORM 可以自动处理数据库迁移,这意味着它可以比较模型定义和数据库表结构的差异,并自动创建或修改表结构。
  5. 查询构建器

    • GORM 提供了一个强大的查询构建器,允许你以一种声明性的方式构建 SQL 查询,而不需要直接写 SQL 语句。
  6. 关联处理

    • GORM 支持多种类型的关联,如一对一、一对多和多对多。这些关联可以很容易地在模型中定义,并在查询时自动处理。
  7. 事务处理

    • GORM 支持事务处理,确保数据库操作的原子性。
  8. 钩子(Hooks)

    • GORM 允许你在特定的数据库操作前后添加自定义逻辑,如在创建记录前后执行某些操作。
  9. 链式操作

    • GORM 支持链式调用,使得代码更加简洁和易于阅读。
  10. 日志记录

    • GORM 可以记录所有执行的 SQL 语句,这对于调试和性能优化非常有用。
  11. 自定义方法

    • 可以在模型上定义自定义方法,这些方法可以封装复杂的数据库操作逻辑。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

 期末放假自学Gin框架,希望我们可以一起学习!

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

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

相关文章

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列,给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取,包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

水箱高低水位浮球液位开关

水箱高低水位浮球液位开关概述 水箱高低水位浮球液位开关是一种用于监测和控制水箱中液位的自动化设备,它能够在水箱液位达到预设的高低限制时,输出开关信号,以控制水泵或电磁阀的开闭,从而维持水箱液位在一个安全的范围内。这类设…

【排序算法】插入排序(希尔排序)

一.直接插入排序 1.基本思想 直接插入排序是一种简单的插入排序法,其核心思想是对一个已经有序的序列插入一个数据,该数据依次比较有序序列中的值,直到插入到合适的位置。在我们玩扑克牌整理牌序的时候,用到的就是直接插入排序的…

Vue3.js“非原始值”响应式实现基本原理笔记(二)

如果您觉得这篇文章有帮助的话!给个点赞和评论支持下吧,感谢~ 作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

28行代码完成深度学习模型——线性模型 01

在这里插入代码片## 线性模型 机器学习中的线性模型是一种预测模型,它基于线性关系来预测输出值。这种模型假设输入特征(自变量)和输出(因变量)之间存在线性关系。线性模型通常具有以下形式: y x*w b 其…

【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁

文章目录 基于ATmega16的数码管独立按键密码锁设计实验报告实验背景硬件介绍主要元器件电路连接 设计原理硬件设计软件设计 程序原理延时函数独立按键检测密码显示主函数 资源代码 基于ATmega16的数码管独立按键密码锁设计实验报告 实验背景 本实验旨在设计并实现一个基于ATm…

数据库系统原理练习 | 作业1-第1章绪论(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业,以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方,欢迎各位斧正。 专业课本: 目录 一、选择题 二:简答题 三:综合题 一、选择…

DAY21-力扣刷题

1.买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int[] prices) {int minpriceInteger.MAX_VALUE;int maxprofit0;for(int i0;i<prices.length;i){if(prices[i]<minprice){minpriceprices[…

昇思MindSpore学习笔记5-01生成式--LSTM+CRF序列标注

摘要&#xff1a; 记录昇思MindSpore AI框架使用LSTMCRF模型分词标注的步骤和方法。包括环境准备、score计算、Normalizer计算、Viterbi算法、CRF组合,以及改进的双向LSTMCRF模型。 一、概念 1.序列标注 标注标签输入序列中的每个Token 用于抽取文本信息 分词(Word Segment…

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃 import java.net.InetAddress;public class GetHostIp {public static void main(String[] args) {try {long start System.currentTimeMillis();String ipAddress InetAddress.getLocalHost().getHostA…

【计算机网络】物理层(作业)

1、若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB 条件下的极限数据传输速率&#xff0c;则信号状态数至少是&#xff08;D&#xff09;。 A. 4B. 16C. 8D. 32 解析&#xff1a;可用奈奎斯特采样定理计算无噪声情况下的极限数据传输速率&#xff0c;用香农第二定…

Docker 容器网络及其配置说明

Docker 容器网络及其配置说明 docker容器网络docker的4种网络模式bridge 模式container模式host 模式none 模式应用场景 docker 容器网络配置Linux 内核实现名称空间的创建创建 Network Namespace操作 Network Namespace 转移设备veth pair创建 veth pair实现 Network Namespac…

三、docker配置阿里云镜像仓库并配置docker代理

一、配置阿里云镜像仓库 1. 登录阿里云官网&#xff0c;并登录 https://www.aliyun.com/ 2. 点击产品 - 容器 - 容器与镜像服务ACR - 管理控制台 - 镜像工具 - 镜像加速器 二、配置docker代理 #1. 创建docker相关的systemd文件 mkdir -p /etc/systemd/system/docker.servic…

SQLite 嵌入式数据库

目录&#xff1a; 一、SQLite 简介二、SQLite 数据库安装1、安装方式一&#xff1a;2、安装方式二&#xff1a; 三、SQLite 的命令用法1、创建、打开、退出数据库&#xff1a;2、编辑数据库&#xff1a; 四、SQLite 的编程操作1、打开 / 创建数据库的 C 接口&#xff1a;2、操作…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…

基于springboot+vue+uniapp的高校宿舍信息管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

【数据结构/操作系统 堆和栈】区别及应用场景、底层原理图解

堆和栈 比较有趣的是&#xff0c;计算机网络、操作系统中都会对堆栈有不同方面比较详细的描述&#xff0c;而使用的地方通常对这些底层的细节表现得没有那么明显。 但如果你能了解堆栈在计算机网络和操作系统中的表现形式&#xff0c;在你写代码时就会有不一样的认识&#xff…

Nordic 52832作为HID 键盘连接配对电视/投影后控制没反应问题的分析和解决

问题现象&#xff1a;我们的一款HID键盘硬件一直都工作的很好&#xff0c;连接配对后使用起来和原装键盘效果差不多&#xff0c;但是后面陆续有用户反馈家里的电视等蓝牙设备配对连接我们的键盘后&#xff0c;虽然显示已连接&#xff0c;但实际上控制不了。设备涉及到了好些品牌…

Sentinel-1 Level 1数据处理的详细算法定义(一)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

linux软链接和硬链接的区别

1 创建软链接和硬链接 如下图所示&#xff0c;一开始有两个文件soft和hard。使用 ln -s soft soft1创建软链接&#xff0c;soft1是soft的软链接&#xff1b;使用ln hard hard1创建硬链接&#xff0c;hard1是hard的硬链接。可以看到软链接的文件类型和其它3个文件的文件类型是不…