go语言的成神之路-筑基篇-gin常用功能

第一节-gin参数绑定

目录

第一节-?gin参数绑定

ShouldBind简要概述

功能:

使用场景:

可能的错误:

实例代码

效果展示

第二节-gin文件上传

选择要上传的文件

选择要上传的文件。

效果展示?

代码部分

第三节-gin请求重定向

第四节-gin路由和路由组

Any用法

NoRoute

路由组


ShouldBindgin框架中的一个方法,用于将请求中的数据绑定到指定的结构体上。

ShouldBind简要概述

  • 功能
    • 它会根据请求的Content-Type自动解析请求中的数据,并将其绑定到传入的结构体指针所指向的结构体中。
    • 对于GET请求,它会尝试从查询参数中解析数据;对于POST请求,它会根据Content-Type进行不同的解析,例如application/x-www-form-urlencodedapplication/json等。
  • 使用场景
    • 当你需要从客户端请求中提取数据并存储到结构体中时,使用ShouldBind可以方便地将请求中的数据映射到结构体的字段上。
    • 它会自动处理数据类型的转换,将请求中的字符串数据转换为结构体字段对应的类型。
  • 可能的错误
    • 如果请求中的数据无法正确解析或转换为结构体字段的类型,ShouldBind会返回错误。
    • 例如,如果请求中某个字段的值无法转换为结构体中相应字段的类型(如将字符串 “abc” 转换为int类型),会导致绑定失败并返回错误。

实例代码

package mainimport ("fmt""net/http""github.com/gin-gonic/gin"
)// 定义结构体
type UserInfo struct {UserName string `form:"username"`Password string `form:"password"`
}func main() {r := gin.Default()r.GET("/user", func(c *gin.Context) {var u UserInfoerr := c.ShouldBind(&u)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})} else {fmt.Printf("u:%#v
", u)c.JSON(http.StatusOK, gin.H{"username": u.UserName,"password": u.Password,})}})r.Run(":1205")
}

效果展示

第二节-gin文件上传

选择要上传的文件

// 处理 POST 请求到 /upload 路径r.POST("/upload", func(c *gin.Context) {// 从请求中获取名为 f1 的文件f, err := c.FormFile("f1")if err != nil {// 记录错误信息log.Printf("Error retrieving file: %v", err)// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to retrieve file",})return}// 验证文件大小,假设限制文件大小为 5MBif f.Size > 1024*1024*5 {// 记录文件大小超出限制的错误信息log.Printf("File size too large: %v", f.Size)// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "File size exceeds limit",})return}// 验证文件类型,假设只允许 JPEG 和 PNGif f.Header.Get("Content-Type") != "image/jpeg" && f.Header.Get("Content-Type") != "image/png" {// 记录文件类型错误信息log.Printf("Invalid file type: %v", f.Header.Get("Content-Type"))// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid file type",})return}// 构建保存文件的目标路径dst := path.Join("./", f.Filename)// 保存上传的文件if err := c.SaveUploadedFile(f, dst); err != nil {// 记录保存文件时的错误信息log.Printf("Error saving file: %v", err)// 返回错误响应c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save file",})return}// 返回成功响应c.JSON(http.StatusOK, gin.H{"status": "ok",})})

对上传的文件进行相对应的操作。

选择要上传的文件。

效果展示

代码部分

因为前端部分较为简单,在这里就不再进行展示了。

package mainimport ("log""net/http""path""github.com/gin-gonic/gin"
)func main() {// 创建一个默认的 gin 路由r := gin.Default()// 加载 index.html 文件r.LoadHTMLFiles("./index.html")// 处理 GET 请求到 /index 路径r.GET("/index", func(c *gin.Context) {// 渲染 index.html 文件c.HTML(http.StatusOK, "index.html", nil)})// 处理 POST 请求到 /upload 路径r.POST("/upload", func(c *gin.Context) {// 从请求中获取名为 f1 的文件f, err := c.FormFile("f1")if err != nil {// 记录错误信息log.Printf("Error retrieving file: %v", err)// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to retrieve file",})return}// 验证文件大小,假设限制文件大小为 5MBif f.Size > 1024*1024*5 {// 记录文件大小超出限制的错误信息log.Printf("File size too large: %v", f.Size)// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "File size exceeds limit",})return}// 验证文件类型,假设只允许 JPEG 和 PNGif f.Header.Get("Content-Type") != "image/jpeg" && f.Header.Get("Content-Type") != "image/png" {// 记录文件类型错误信息log.Printf("Invalid file type: %v", f.Header.Get("Content-Type"))// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid file type",})return}// 构建保存文件的目标路径dst := path.Join("./", f.Filename)// 保存上传的文件if err := c.SaveUploadedFile(f, dst); err != nil {// 记录保存文件时的错误信息log.Printf("Error saving file: %v", err)// 返回错误响应c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save file",})return}// 返回成功响应c.JSON(http.StatusOK, gin.H{"status": "ok",})})// 启动服务器,监听 1205 端口r.Run(":1205")
}

第三节-gin请求重定向

注意此处请求的是ddd

回车之后

ddd变成了a

仔细观察后端部分的代码,不难看出,访问ddd的时候,跳转到了a,访问a的时候跳转到了b,所以会打印出b中存放的信息。也就是上述效果中展示的样子。

第四节-gin路由和路由组

Any用法

Any可以匹配任何形式的请求,这里因为没有postman所以没有对其他形式的请求进行测试,大家可以自行使用postman进行测试。

NoRoute

当没有对应的请求的时候,会进入到这一函数,如果没有进行定义就会出现404错误的页面。这里也只是对404页面进行了一下自定义操作。

路由组

路由组

路由组可以嵌套路由组

路由组可以添加中间件

路由组可以添加路由

路由组可以添加静态文件

路由组可以添加模板

路由组可以添加重定向

路由组可以添加错误处理

路由组可以添加自定义渲染器

仔细观察这三个图片的url不难看出都是voide开头的,因此我们可以将它们分成一个组来进行汇总一下。将他们的公共前缀提取出来,使得代码看起来不那么繁琐。

这样看起来更加条理清晰,用一个{}进行包括。

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

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

相关文章

Qt 12.28 day3

作业: 1】 思维导图 2】 在登录界面的登录取消按钮进行以下设置: 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&a…

mybatis-plus 用法总结

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,旨在简化开发者的 CRUD 操作。它在 MyBatis 的基础上提供了更多的功能和便利性,如代码生成器、分页插件、性能分析插件等,使开发者能够更高效地进行数据库操作。MyBatis-P…

Rust: enum 和 i32 的区别和互换

在Rust编程语言中,enum(枚举)和i32是两种不同类型的数据结构,它们各自有不同的用途和特性。 i32 i32是一个32位的有符号整数类型。它用于存储整数值,范围从-2,147,483,648到2,147,483,647。i32是Rust中的基本数据类型…

迁移学习 详解及应用示例

简介: 迁移学习是一种机器学习技术,其核心思想是利用在一个任务上已经学到的知识(源任务:任务已经有一个训练好的模型,然后我们将这个模型的某些部分或知识迁移到一个新的但相关的“目标任务”上。)来帮助解…

【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点

etcd 是一个高可用的分布式键值存储,广泛应用于存储服务发现、配置管理等场景。为了确保集群的稳定性和可扩展性,管理成员节点的添加、删除和更新变得尤为重要。本文将指导您如何在etcd集群中处理成员管理,帮助您高效地维护集群节点。 目录 …

前端 学习

vue结构 package.json 作用:记录项目的元信息,包括依赖包、脚本命令、项目名称、版本号等。 常见字段: dependencies:运行时依赖的 npm 包。 devDependencies:开发时使用的依赖包。 scripts:定义 npm 脚本…

矩阵的因子分解1-奇异值分解

文章目录 矩阵的因子分解1-奇异值分解求法归纳例1. 对矩阵 A ( 0 1 − 1 0 0 2 1 0 ) A \begin{pmatrix} 0 & 1 \\ -1 & 0 \\ 0 & 2 \\ 1 & 0 \end{pmatrix} A ​0−101​1020​ ​ 进行奇异值分解1. 计算 A H A A^H A AHA 的特征值和特征向量2. 将奇异值按…

网易企业邮箱登陆:保障数据安全

网易企业邮箱是一款为企业提供安全可靠的电子邮件服务的工具。通过网易企业邮箱,企业可以实现员工之间的高效沟通和信息共享,同时保障数据的安全性。 企业邮箱的安全性是企业信息保护的重要组成部分。网易企业邮箱采用了多层加密技术,确保邮件…

王佩丰24节Excel学习笔记——第二十二讲:制作甘特图与动态甘特图

【以 Excel2010 系列学习,用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 插入图表,针对每一个图表上的元素,都可以选中选右键进行修改数据;本章中的向两端延伸,设置数据的原理;数据格式的显示方式&…

LeetCode 1705.吃苹果的最大数目:贪心(优先队列) - 清晰题解

【LetMeFly】1705.吃苹果的最大数目:贪心(优先队列) - 清晰题解 力扣题目链接:https://leetcode.cn/problems/maximum-number-of-eaten-apples/ 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,…

Docmatix:突破性的文档视觉问答数据集

Docmatix:突破性的文档视觉问答数据集 1. 数据集概述 1.1 规模与创新 数据规模: 240万张图像950万个问答对来自130万份PDF文档较现有数据集扩大240倍 应用领域:文档视觉问答(DocVQA)可访问性:通过HuggingFace平台开放获取 2. …

Doris使用注意点

自己学习过程中整理,非官方 dws等最后用于查询的表可以考虑使用row存储加快查询,即用空间换时间duplicate key的选择要考虑最常查询使用适当使用bloomfilter 加速查询适当使用aggregate 模式降低max,avg,min之类的计算并加快查询,比如加速明细和汇总的一体化查询使用ALTER…

Kubernetes之NodeSelector与NodeName实战

目录 目标 版本 官网 概述 实战 NodeName实战 NodeSelector实战 目标 通过配置NodeSelector与NodeName实现Pod运行(或优先运行)在我们期望的节点之上。了解这两种实现方法的区别。 版本 Kubernets v1.25.0 官网 将Pod分配给节点https://kubernet…

【docker系列】打造个人私有网盘zfile

1. 介绍 是一个适用于个人的在线网盘(列目录)程序,可以将你各个存储类型的存储源,统一到一个网页中查看、预览、维护,再也不用去登录各种各样的网页登录后管理文件 2. 需要环境 2.1 硬件需求 CPU:至少1核 内存:推荐…

系统思考—冰山模型

“卓越不是因机遇而生,而是智慧的选择与用心的承诺。”—— 亚里士多德 卓越,从来不是一次性行为,而是一种习惯。正如我们在日常辅导中常提醒自己:行为的背后,隐藏着选择的逻辑,而选择的根源,源…

麒麟信安参展南京软博会,支持信创PC的新一代云桌面及全行业解决方案备受瞩目

12月20日至22日,由中国软件行业协会、江苏省软件行业协会等单位联合主办的2024中国(南京)软件产业博览会在南京国际博览中心隆重开幕。本届博览会以“软件驱动未来,数字闪耀金陵”为主题,吸引了各界目光,省…

【PLL】电荷泵锁相环各个环路参数意义

电荷泵锁相环(CPPLL)在模拟锁相环占据主导, 因为在环路中实现了积分器,而没有有缘放大器即:type 2锁相环可以使用无源RC滤波器实现,简化了PLL设计。 简单CPPLL 与C1串联电阻R1形成零点。 电容累积相位误差,提供积分路…

Java 网络原理 ①-IO多路复用 || 自定义协议 || XML || JSON

这里是Themberfue 在学习完简单的网络编程后,我们将更加深入网络的学习——HTTP协议、TCP协议、UDP协议、IP协议........... IO多路复用 ✨在上一节基于 TCP 协议 编写应用层代码时,我们通过一个线程处理连接的申请,随后通过多线程或者线程…

考研互学互助系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库…

Java网约车项目实战实现抢单功能详解

在网约车项目中,抢单功能是非常关键的一部分,它决定了司机能否及时响应乘客的订单,提高整个平台的运营效率。本文将详细介绍如何使用Java来实现网约车项目的抢单功能,并提供一个完整的代码示例,以便读者能够直接运行和参考。 一、项目背景与需求分析 1.项目背景 随着移…