Gin 相对 标准库 net/http的优势

这些优势主要体现在以下几个方面:

  1. 简洁的路由分组和中间件支持
    Gin允许开发者使用简洁的API来定义路由,支持路由分组和中间件,这使得构建具有复杂路由规则的大型应用变得更加简单和高效。

  2. 参数化路由
    Gin支持参数化路由,可以很容易地从URL中提取参数,而无需手动解析URL字符串。

  3. 性能
    Gin提供了比net/http更优化的性能,特别是在并发处理多个请求时表现更佳。

  4. 错误处理
    Gin允许通过中间件或内置方法集中处理错误,使得代码更加清晰和容易维护
    使用Gin框架实现的示例,展示如何定义具有参数化和分组路由的HTTP服务器

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {router := gin.Default() // 创建一个Gin实例// 分组路由示例api := router.Group("/api") {api.GET("/user/:id", func(c *gin.Context) {// 从URL中提取id参数userID := c.Param("id")c.JSON(http.StatusOK, gin.H{"user_id": userID,})})api.POST("/submit", func(c *gin.Context) {// 这里可以处理POST请求c.String(http.StatusOK, "Submit Successful")})}// 中间件示例:记录请求router.Use(func(c *gin.Context) {// 这里可以加日志记录逻辑c.Next() // 调用该请求的剩余处理程序})// 默认路由router.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "Welcome to Gin HTTP Server")})// 启动服务器router.Run(":8091")
}
  • 创建Gin实例:
    使用gin.Default()创建一个Gin路由器实例,这个实例已经集成了日志和恢复中间件,用于处理panic和记录请求信息。

  • 路由分组:
    使用router.Group(“/api”)创建路由分组,可以将相关的路由组织在一起,使得路由管理更加模块化。

  • 参数化路由:
    使用api.GET(“/user/:id”, …)定义一个GET请求的路由,其中:id是一个参数占位符,可以通过c.Param(“id”)直接获取该参数。

  • 使用中间件:
    通过router.Use(…)添加一个全局中间件,用于在处理请求前进行某些操作(如日志记录)。c.Next()调用确保处理链中的其他处理程序被执行。

  • 启动服务器:
    router.Run(“:8091”)监听并在8091端口上运行HTTP服务器。
    使用Gin框架可以更容易地管理复杂的路由和请求处理逻辑,同时提高了代码的可读性和维护性。这些特性尤其在构建大型或复杂Web应用时显示出其优势。

要用标准库 net/http 来实现类似于上述Gin示例代码的功能,代码会稍微复杂一些,因为 net/http 不直接支持像Gin那样的参数化路由和中间件。

package mainimport ("fmt""net/http""strings"
)func main() {mux := http.NewServeMux()// 处理根路由mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {if r.URL.Path == "/" {w.Write([]byte("Welcome to HTTP Server"))return}http.NotFound(w, r)})// 处理/api/user/{id}的GET请求mux.HandleFunc("/api/user/", func(w http.ResponseWriter, r *http.Request) {if r.Method != "GET" {w.WriteHeader(http.StatusMethodNotAllowed)return}// 解析URL中的用户IDparts := strings.Split(r.URL.Path, "/")if len(parts) < 4 {http.NotFound(w, r)return}userID := parts[3]fmt.Fprintf(w, "User ID: %s", userID)})// 处理/api/submit的POST请求mux.HandleFunc("/api/submit", func(w http.ResponseWriter, r *http.Request) {if r.Method != "POST" {w.WriteHeader(http.StatusMethodNotAllowed)return}w.Write([]byte("Submit Successful"))})// 中间件功能的简单实现finalHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {logRequest(r)  // 日志记录函数mux.ServeHTTP(w, r)  // 将请求传递给mux处理})// 启动HTTP服务器http.ListenAndServe(":8091", finalHandler)
}// 日志记录请求
func logRequest(r *http.Request) {fmt.Printf("Received request %s %s\n", r.Method, r.URL.Path)
}
  • http.ServeMux:
    使用http.NewServeMux()创建一个新的路由多路复用器。这是标准库提供的用于路由请求到对应处理函数的组件。

  • 参数化路由的处理:
    标准库不直接支持像/api/user/:id这样的路由,因此需要手动解析URL来提取参数。在示例中,路径被分割并从中提取用户ID。

  • 中间件的实现:
    Gin的中间件通过Gin的路由处理器自动调用。在这里,我们手动创建一个函数,用于记录日志,然后调用多路复用器(mux)来继续处理请求。

  • 处理不同的HTTP方法:
    对于/api/submit路径,首先检查是否是POST请求,如果不是,则返回405状态码。

  • 启动服务器:
    使用http.ListenAndServe监听8091端口,传入封装了日志记录功能的处理函数,这样每个请求都会先经过这个日志记录函数。

推荐一个 gin 讲的通俗易懂的

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

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

相关文章

pyside6自定义部件库和软件框架的建设记录

一、自定义部件库 原则上尽量做到前后端分离&#xff0c;接口方便&#xff0c;复制简单。 1、单选框部件 # encoding: utf-8 ################################################### # 自定义的单选框 #################################################### 对外…

wsl2 arch linux访问ch340串口和usb设备

wsl2 arch linux访问ch340串口和usb设备 安装usb转网络软件usbipd共享usb到网络wsl2安装usbip挂载USB设备卸载USB设备 安装usb转网络软件usbipd 在powershell执行下面命令安装 winget install --interactive --exact dorssel.usbipd-win共享usb到网络 #查看USB设备 usbipd l…

基于模型预测算法的含储能微网双层能量管理模型

基于模型预测算法的含储能微网双层能量管理模型 文章目录 基于模型预测算法的含储能微网双层能量管理模型一、项目介绍二、源程序下载 一、项目介绍 代码主要做的是一个微网双层优化调度模型&#xff0c;微网聚合单元包括风电、光伏、储能以及超级电容器&#xff0c;在微网的运…

Go语言mac环境搭建详解

Go语言mac环境搭建详解见视频&#xff0c;视频下方也有讲解具体的操作步骤。 Golang Mac电脑环境搭建、开发工具Vscode配置 Go语言mac环境搭建步骤如下&#xff1a; 1、下载安装Golang Go官网下载地址&#xff1a;https://golang.org/dl/ Go官方镜像站&#xff08;推荐&…

Windows下如何确定DLL动态库是32位还是64位

文章目录 Windows下如何确定DLL动态库是32位还是64位使用dumpbin工具可能出现的问题结果输出内容 Windows下如何确定DLL动态库是32位还是64位 使用dumpbin工具 dumpbin.exe通常位于Visual Studio的安装目录下的VC\bin或VC\Tools\MSVC\<version>\bin\Hostx64\x64 比如&am…

海山数据库(He3DB)Redis技术实践:继承开源Redis精髓,强化升级企业级服务

数字化转型中的企业数据的处理速度和效率直接关系到企业的竞争力&#xff0c;Redis作为业界广泛使用的开源键值对存储系统&#xff0c;以其卓越的性能和丰富的数据结构&#xff0c;成为了众多开发者和企业的首选。然而&#xff0c;近期Redis开源社区对Redis协议进行了变更&…

电力综合自动化系统对电力储能技术的影响有哪些?

电力综合自动化系统对电力储能技术的影响主要体现在以下几个方面&#xff1a; 提高能源利用效率&#xff1a;电力综合自动化系统通过优化调度和能量管理&#xff0c;可以实现储能设备的有效利用&#xff0c;提高能源利用效率。在电力系统中&#xff0c;储能设备可以有效地平抑风…

第十一篇JavaScript JSON与AJAX

JSON 在JavaScript中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是一种常用的数据格式&#xff0c;用于存储和交换数据。它基于JavaScript的对象字面量语法&#xff0c;但具有更宽松的语法规则。 json 是一种轻量级的数据交换格式。 JSON使用键值对…

贪心算法:排列算式

题目描述 给出n数字&#xff0c;对于这些数字是否存在一种计算顺序&#xff0c;使得计算过程中数字不会超过3也不会小于0&#xff1f; 输入描述: 首行给出一个正整数t,(1≤t≤1000)代表测试数据组数每组测试数据第一行一个正整数n,(1≤n≤500)第二行包含n个以空格分隔的数字…

Flutter - flutter_gen 资源管理

引言&#xff1a; 在开发 Flutter 应用时&#xff0c;我们经常需要使用各种静态资源&#xff0c;如图片、字体和音频等。如何有效地管理和加载这些资源呢&#xff1f;本篇博客将以图片为例带你解密 Flutter 项目中是如何管理资源地。 assets 加载资源 具体文件名引入 在工程…

STC89C52学习笔记(九)

STC89C52学习笔记&#xff08;九&#xff09; 综述&#xff1a;本文主要介绍了蜂鸣器、蜂鸣器如何使用以及如何利用蜂鸣器播放不同频率声音。 一、蜂鸣器 1.定义和作用 电信号→声音信号&#xff0c;常用来产生按键音和报警音。 2.分类 有源&#xff1a;自带振荡器&#…

机器学习 -- 端到端的机器学习项目

场景 我们将一个端到端的项目&#xff08;一个从开始到结束包含了所有必要步骤和组件的完整项目&#xff09;案例&#xff0c;步骤大概有&#xff1a; 1.观察大局。 2.获得数据。 3.从数据探索和可视化中获得洞见。 4.机器学习算法的数据准备。 5.选择和训练模型。 6.微调模型…

git lfs 大文件管理

简介 git-lfs 是 Git Large File Storage 的缩写&#xff0c;是 Git 的一个扩展&#xff0c;用于处理大文件的版本控制。 它允许你有效地管理和存储大型二进制文件&#xff0c;而不会使 Git 仓库变得过大和不稳定。以下是一些与 git-lfs 相关的常见命令和解释&#xff1a; 常…

Django的路由分组和路由转发器

02 查询文章信息 文章列表模板 复制zdpdjango_basic&#xff0c;然后在templates中新建一个articles.html文件&#xff0c;用来展示文章列表&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><tit…

unity——Button组件单击双击长按功能

1.实现单击、双击、长按功能 using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; public class ButtonControl_Click_Press_Double : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler {publi…

组合积木(模拟

题目 #include<bits/stdc.h> using namespace std; #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define int long long #define eb emplace_back const int N1e39; int n,m; vector<pair<char,int> > s[N]; signed main(){ios;cin>…

紫光同创 ----- 集创赛 ---- 点亮LED

目录 一. 安装软件&#xff1a; 1. 按照安装手册一步一步走 2. 等.... 3. 桌面图标 二. 创建工程 1. 双击PDS 2. 点击新建工程 New Project 3. 弹出如下界面 点击 -->> Next 4. 选择工程路径和名称 5. 选择工程类型 6. 剩下的全部next &#xff08;直到…

SOCKS5代理、代理IP、跨界电商、游戏技术与网络安全的综合探讨

在全球经济一体化的大背景下&#xff0c;"出海"已成为许多企业尤其是电商和游戏行业的重要战略方向。然而&#xff0c;随着企业业务的扩展到海外市场&#xff0c;网络安全、数据隐私和内容访问等问题也随之而来。本文将深入探讨SOCKS5代理、代理IP在跨界电商和游戏行…

idea: 没有 new java class

如图&#xff1a; 解决&#xff1a; 右键点击--> Mark Directory as --> Sources Root ok

在CentOS 7上如何将MySQL数据目录更改到新位置

简介 数据库会随着时间的推移而增长&#xff0c;有时会超出文件系统的空间。当它们位于与操作系统的其余部分相同的分区上时&#xff0c;您还可能遇到I/O争用。RAID、网络块存储和其他设备可以提供冗余和其他理想的功能。无论您是添加更多空间&#xff0c;评估性能优化的方法&…