Go框架之Gin应用到原理源码

2023-10-29

Go框架之Gin应用到原理源码

基本概览:

目前 golang使用最广泛的Web 微框架之一。具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务。
本文将从基本应用快速上手到中间件集成,自定义中间件和Gin + router 原理源码解读

官方地址:https://github.com/gin-gonic/gin

中文API:文档 | Gin Web Framework

案例:

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

下载依赖
import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()                     //拿到一个 *gin.Engine
	r.GET("ping", func(ctx *gin.Context) { //获取GET请求
		ctx.JSON(200, gin.H{
			"msg": "pong",
		})
	})
	r.Run() //开启服务  0.0.0.0:8080
}



addRoute

gin. Default 还有gin. New

关系:default 内部也是调用的 New 但是会默认加上 Logger 和 Recovery中间件

HTTP请求 及 Handle

GET POST

    router.GET("/someGet", getting)
	router.POST("/somePost", posting)
	router.PUT("/somePut", putting)
	router.DELETE("/someDelete", deleting)
	router.PATCH("/somePatch", patching)
	router.HEAD("/someHead", head)
	router.OPTIONS("/someOptions", options)
func someGet(c *gin.Context) {
	fmt.Println("someGet")
	c.Writer.WriteString("this is someGet()")
}
func somePost(c *gin.Context) {
	fmt.Println("somePost")
	c.Writer.WriteString("this is somePost()")
}

func main() {
	r := gin.Default()                     //拿到一个 *gin.Engine
	r.GET("ping", func(ctx *gin.Context) { //获取GET请求
		ctx.JSON(200, gin.H{
			"msg": "pong",
		})
	})

	r.GET("/someGet", someGet)
	r.POST("/somePost", somePost)
	r.Run() //开启服务  0.0.0.0:8080
}

请求参数处理:

Get请求

关键方法

c.Query(“key”) (.var 会自动填充前面)

c.DefaultQuery(“key”,“xxoo”) 没有key 会给一个默认值

Post请求

关键方法

c.PostForm()

c.DefaultPostFrom()

代码实现:

func getKey(c *gin.Context) {
	s := c.Query("name")
	ss := c.DefaultQuery("age", "xxoo")
	c.String(200, "this is getKey() 获取到key=%s   %s", s, ss)
}

func postVal(c *gin.Context) {
	s := c.PostForm("name")
	ss := c.DefaultPostForm("age", "xxoo")
	// c.HTML(200, "welcome.html", gin.H{
	// 	"name": s,
	// 	"age":  ss,
	// })
	c.String(200, "this is postVal() 获取到key=%s   %s", s, ss)
}

func main (){
	r := gin.Default()  
    r.GET("/getKey", getKey)
	r.POST("/postVal", postVal)
    ...
}

RestFul风格路径参数

使用c.Param(“key”)方法

e.GET(“/hello/:username”,testPathParam)

e.GET(“/hello/:username/:age”,testPathParam) 可多个

func getParam(c *gin.Context) {
	usename := c.Param("usename")
	age := c.Param("age")
	c.String(200, "this is getKey() 获取到key=%s   %s", usename, age)
}
main方法中 :	
		//r.GET("/getParam/:usename", getParam)
	r.GET("/getParam/:usename/:age", getParam)

http://localhost:8080/getParam/xxx/18

引入模板引擎 HTML

query.html

然后 e.LoadHTMLGlob(“templates/*”)

func postVal(c *gin.Context) {
	s := c.PostForm("name")
	ss := c.DefaultPostForm("age", "xxoo")
	c.HTML(200, "welcome.html", gin.H{
		"name": s,
		"age":  ss,
	})
	//c.String(200, "this is postVal() 获取到key=%s   %s", s, ss)
}

并且在main方法中 
r.LoadHTMLGlob("src/gin/01/templates/*")

页面get与post都有

像百度搜索 goSearch跳到 搜索页面 结果分页的?过来

//比如:https://www.baidu.com/s?wd=xxoo页面的表单

func search(c *gin.Context) {
	page := c.DefaultQuery("page", "0")
	key := c.PostForm("key")
	age := c.PostForm("age")
	hobby := c.PostFormArray("hobby")
	c.String(200, "this is search() 获取到 page:%s   key:%s   age:%s    hobby:%s", page, key, age, hobby)
}

main方法中
	r.POST("/search", search)

数据绑定Form表单

​ c.ShouldBind(&user)

func toRegister(c *gin.Context) {
	c.HTML(200, "register.html", nil)
}
func register(c *gin.Context) {
	var user model.User
	c.ShouldBind(&user)
	c.String(200, "获取到 %s", user)
}

func main (){
	r := gin.Default()     
	r.GET("/toRegister", toRegister)
	r.POST("/register", register)
	r.Run() //开启服务  0.0.0.0:8080
}



type User struct {
	UserName string   `form:"name"`//如果页面表单的字段名与结构体的一致 可以省略此
	Password string   `form:"password"`
	Hobby    []string `form:"hobby"`
}

 <form action="/register" method="post">
        <input name="name"><br/>
        <input name="password"><br/>
        <input type="checkbox" name="hobby" value="GoLang" >GoLang
        <input type="checkbox" name="hobby" value="Java" >Java
        <input type="checkbox" name="hobby" value="C++" >C++
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go框架之Gin应用到原理源码 的相关文章

  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮

随机推荐

  • Python手势识别

    这是借鉴了github上的一个源程序 参考源 https github com lzane Fingers Detection using OpenCV and Python 自己在这个基础上做了一点修改补充后 可以实现手指指尖的检测 并且
  • kettle ORA-00942: 表或视图不存在(2022/01/15)

    问题描述 kettle对接客户的oracle数据库 一开始给我的账号少赋了一张表的权限 这张表是之后赋给我的 对接中发现 在kettle预览有这张表的sql的时候 就会报上述错误 但是在navicat里面跑sql是成功的 解决方案 用模式
  • FMC141-4路 250Msps/16bits ADC, FMC板卡

    FMC141 4路 250Msps 16bits ADC FMC板卡 一 产品概述 本板卡基于 FMC 标准板卡 实现 4 路 16 bit 250Msps ADC 功能 遵循 VITA 57 标准 板卡可以直接与VME VXS AMC V
  • 数据中台元年,企业数字化转型面临的三大挑战

    随着企业信息化程度越来越高 企业掌握的数据量从原来的TB级发展到PB级 再到EB级甚至往ZB级别发展 数据形式也在从原来的结构化数据为主转变为以日志 视频 图片 语音等非结构化数据为主 然而 数据存储和计算 数据组织的运行都是有成本的 当数
  • python计算GPA,附带详细讲解

    这里采用标准计算公式 S 学科分数 P 学科绩点 n 学科数目 下面举个例子 比如 数学 90 绩点4 语文 80 绩点3 英语 70 绩点2 GPA 90 4 80 3 80 2 4 4 3 2 100 3 29 相关代码如下 score
  • adb常用命令

    查看当前连接设备 adb devices如果发现多个设备 adb s 设备号 其他指令 举例 adb s devicel install xxx apk 查看顶部Activity windows环境下 adb shell dumpsys a
  • SIGSEGV与SIGBUS

    http www cnblogs com whyandinside archive 2013 01 07 2848806 html SIGSEGV与SIGBUS SIGBUS Bus error 意味着指针所对应的地址是有效地址 但总线不能
  • CMakeLists.txt 的阅读

    前言 CMake允许开发者编写一种平台无关的 CMakeList txt 文件来定制整个编译流程 然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件 如 Unix 的 Makefile 或 Windows 的 Vi
  • 【Proteus仿真】【51单片机】蔬菜大棚温湿度控制系统设计

    文章目录 一 主要功能 二 使用步骤 三 硬件资源 四 软件设计 1 主要代码 五 实验现象 联系作者 一 主要功能 1 温湿度上下限阈值设定 2 超限声光报警加热 加湿 3 温湿度显示 二 使用步骤 系统运行后 LCD1602显示当前温湿
  • Nacos快速入门(三):Spring Cloud Alibaba Nacos实现服务注册与发现

    1 前言 Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案 目前已经加入Spring Cloud项目 跟随Spring Cloud一起维护 集成Nacos需要使用Spring Cloud Alibaba N
  • JS parseInt() 、parseFloat()、Number()

    介绍 parseInt string radix parseFloat string Number object 举例 总结 parseInt string radix parseFloat string Number object 介绍
  • c语言中宏定义的关键字,C语言中,宏定义“define”的一种有趣的用法

    在C语言中 宏定义也是一种很重要的概念 可以使用 define 来定义一个常量 也可以用 define 来实现一些功能 这一篇文章中 我们将介绍一下 在C语言中 使用宏定义 define 实现的一个小的例子 我们可以借助 define 将很
  • 汇编:按给定格式在屏幕中间显示字符串

    代码如下 assume cs code ds data ss stac data segment db welcome to masm db 02h 24h 71h data ends stac segment dw 0 0 0 0 0 0
  • Lion:闭源大语言模型的对抗蒸馏

    Lion 闭源大语言模型的对抗蒸馏 Lion 由香港科技大学提出的针对闭源大语言模型的对抗蒸馏框架 成功将 ChatGPT 的知识转移到了参数量 7B的 LLaMA 模型 命名为 Lion 在只有 70k训练数据的情况下 实现了近 95 的
  • 两台服务器文件镜像,两台云服务器镜像

    两台云服务器镜像 内容精选 换一换 请您在购买前确保已完成注册和充值 详细操作请参见如何注册公有云管理控制台的用户 登录管理控制台 单击管理控制台左上角的 选择区域和项目 选择 计算 gt 弹性云服务器 单击 购买弹性云服务器 系统进入购买
  • 删除单链表中的指定节点

    题目1 编写在带头结点的单链表L中删除一个最小值结点的高效算法 假设最小值结点是唯一的 时间复杂度为O n 空间复杂度为O 1 问题解答 算法思想 用p从头至尾扫描单链表 pre指向 p结点的前驱 用minp保存值最小的结点指针 初值为p
  • 那些方法可以绕过服务器对文件内容的检测,文件上传漏洞

    文件上传 文件上传就是在一些web应用中允许用户上传图片 文本等相应文件到服务器指定的位置 而文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中 之后通过url去访问以执行代码达到攻击的目的 可以成功攻击的条件 1 存放上传文件
  • Linux网络编程:IO多路复用——epoll

    服务器端代码 epoll event poll include
  • mysql sqlite 语法_浅谈sqlite与mysql的数据库语法差异_沃航科技

    由于一些原因 小沃将自己的官方网站从原来的阿里云迁移到了justg的vps上 服务器配置也从原理的1核1G变为了1核512M 虽然服务器性能所有下降 但是毕竟小沃的官网是使用了百度的cdn的 因此应付高并发还是没有什么问题的 考虑到服务器性
  • Go框架之Gin应用到原理源码

    Go框架之Gin应用到原理源码 基本概览 目前 golang使用最广泛的Web 微框架之一 具有高性能的优点 基于 httprouter 它提供了类似martini但更好性能 路由性能约快40倍 的API服务 本文将从基本应用快速上手到中间