GoWeb -- gin框架的入门和使用

认识gin

go流行的web框架
go从诞生之初就带有浓重的开源属性,其原生库已经很强大,即使不依赖框架,也能进行高性能开发,又因为其语言并没有一定的设计标准,所以较为灵活,也就诞生了众多的框架,各具有特色,满足不同的喜好。

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

go的框架其实可以理解为库,并不是用了某一个框架就不能用别的框架,可以选择性的使用各个库中的优秀组件,进行组合

gin介绍

Gin 是一个基于 Go 语言编写的 Web 框架,它提供了类似于 Martini 框架但性能更好的 API 服务。Gin 框架的主要特点包括:

  • 高性能:Gin 使用了高性能的 httprouter 作为其底层的 HTTP 路由器,速度提升了近 40 倍。
  • 易用性:Gin 提供了简单好用的核心上下文 Context,以及丰富的工具集,如 JSON/XML 响应、数据绑定与校验等。
  • 路由与中间件:Gin 提供了优雅的路由/中间件系统,支持中间件传入的 HTTP 请求经由一系列中间件和最终操作来处理,例如 Logger、Authorization、GZIP 以及最终的 DB 操作。
  • Crash 处理:Gin 框架可以捕获发生在 HTTP 请求中的 panic 并 recover 它,从而保证服务器始终可用。
  • JSON 验证:Gin 框架可以解析并验证 JSON 格式的请求数据,例如检查某个必须值是否存在。
  • 路由群组:Gin 支持通过路由群组来更好地组织路由,例如是否需要授权、设置 API 的版本等。
  • 无限制的群组嵌套:Gin 支持无限制的路由群组嵌套,不会降低性能。

总之,Gin 是一个高效、易用且功能丰富的 Web 框架,适合用于开发高性能的 Web 应用程序。

gin的安装

首先进行开发环境的准备

mkdir ginlearn

先创建项目目录
进入目录 再使用go work init 命令初始化

go mod init test.com/helloworld
go work use ./helloworld

在这里插入图片描述
然后就可以使用go get命令下载gin框架

在这里插入图片描述
在这里插入图片描述
现在开发环境已经准备好了

第一个gin程序

在项目目录下新建一个main.go,并在里面写入以下代码:

package main

import (
	"github.com/gin-gonic/gin"
	"log"
)

func main() {
	r := gin.Default()
	//curl http://localhost:8080/hello 获取到json返回值
	//{“name”:"hello world"}
	r.GET("/hello", func(context *gin.Context) {
		context.JSON(200, gin.H{
			"name": "hello world",
		})
	})
	err := r.Run(":8080")
	if err != nil {
		log.Fatal(err)
	}
}

然后在浏览器里 访问 http://localhost:8080/hello 就可以看到以下内容

在这里插入图片描述

路由

路由是URI到函数的映射
一个URI含: http://localhost:8080/user/find?id=11

  • 协议,比如http,https等
  • ip端口或者域名,比如127.0.01:8080或者www.test.com
  • path ,比如/path
  • query,比如?query

同时访问的时候,还需要指明http method 比如get post 等

RESTful API规范

RESTful API的规范建议我们使用特定的HTTP方法来对服务器上的资源进行操作。
比如:
GET 表示读取服务器上的资源
POST 表示在服务器上的创建资源
PUT 表示更新或者替换服务器上的资源
DELETE 表示删除服务器上的资源

请求方法

	r.GET("/get", func(ctx *gin.Context) {
		ctx.JSON(200, "get")
	})
	r.POST("/save", func(ctx *gin.Context) {
		ctx.JSON(200, "save")
	})
	r.PUT("/update", func(ctx *gin.Context) {
		ctx.JSON(200, "update")
	})
	r.DELETE("/delete", func(ctx *gin.Context) {
		ctx.JSON(200, "delete")
	})

Any代表任意一种类型都支持

r.Any("/any", func(context *gin.Context) {
		context.JSON(200,gin.H{
			"name":"any",
		})

URI

URI书写的时候,我们不需要关心scheme和authority这两部分,我们主要通过path和query两部分的书写来进行资源的定位。

  • 静态url,比如/hello, /user/find
r.POST("/user/find",func(ctx *gin.Context){
})
  • 路径参数 比如/user/find/:id
r.GET("/get/find/:id", func(ctx *gin.Context) {
		ctx.JSON(200, ctx.Param("id"))
	})

在这里插入图片描述

  • 模糊匹配,比如/user/*path
	r.GET("/get/*path", func(ctx *gin.Context) {
		ctx.JSON(200, ctx.Param("path"))
	})

在这里插入图片描述

处理函数

定义:

type HandlerFUnc func(*Context)

通过上下文的参数,获取http的请求参数,响应http请求等。

分组路由

在进行开发的时候,我们往往要进行模块的划分,比如用户模块,以user开发,商品模块,以goods开头。或者进行多版本开发,不同版本之间路径是一致的,这种时候,就可以用到分组路由了。

	v1 := r.Group("/v1")
	{
		v1.GET("/find", func(ctx *gin.Context) {
			ctx.JSON(200, "find")
		})
		v1.GET("/save", func(ctx *gin.Context) {
			ctx.JSON(200, "save")
		})
	}

	v2  := r.Group("/v2")
	{
		v2.GET("/find", func(ctx *gin.Context) {
			ctx.JSON(200, "find")
		})
		v2.GET("/save", func(ctx *gin.Context) {
			ctx.JSON(200, "save")
		})
	}

请求参数

GET请求参数

使用Get请求传参时,类似于这样http://localhost:8080/user/save?id=11&name=zhangsan

普通参数

request url : http://localhost:8080/user/save?id=11&name=zhangsan

参数后面的部分叫做Query

	r.GET("/user/save", func(context *gin.Context) {
		id := context.Query("id")
		name := context.Query("name")
		context.JSON(200, gin.H{
			"id":   id,
			"name": name,
		})
	})

所以使用context.Query()函数就能获取该格式的参数

在这里插入图片描述
context.GetQuery()可以指明没有的参数:

	r.GET("/user/save", func(context *gin.Context) {
		id := context.Query("id")
		name := context.Query("name")
		address, ok := context.GetQuery("address")
		context.JSON(200, gin.H{
			"id":      id,
			"name":    name,
			"address": address,
			"ok":      ok,
		})
	})

在这里插入图片描述
context.DefaultQuery()可以设置默认值:

	r.GET("/user/save", func(context *gin.Context) {
		id := context.Query("id")
		name := context.Query("name")
		address := context.DefaultQuery("address", "beijing")
		context.JSON(200, gin.H{
			"id":      id,
			"name":    name,
			"address": address,
		})
	})

在这里插入图片描述

还有另一种方式获取到get请求中的参数 就是使用结构体与这种格式的请求参数进行绑定

首先需要声明一个结构体(需要先进行绑定)

type User struct {
	Id   int64  `form:"id""`
	Name string `form:"name""`
}

然后在处理的GET请求中编写如下代码:

	r.GET("/user/save", func(context *gin.Context) {
		var user User
		err := context.BindQuery(&user)
		if err != nil {
			log.Println(err)
		}

		context.JSON(200, user)
	})

主要是通过context.BindQuery(&user)的方法与实例化出来的结构user进行绑定。

在这里插入图片描述
context.ShouldBindQuery(&user)会更高级一些

数组参数

请求url:http://localhost:8080/user/get/?address=Beijing&address=shanghai

都是address=xxx , 这里就需要用数组的形式去接收参数。

r.GET("/user/get", func(context *gin.Context) {
		address := context.QueryArray("address")
		context.JSON(200, address)
	})

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频怎么加水印?如何录制带水印的视频?

案例:如何给视频添加水印? 【我发布在短视频平台的视频,总是被别人盗用,我想给自己的视频添加水印。有没有视频添加水印的方法?在线等!】 很多视频制作者或者爱好者,都希望自己的视频作品得到…

腾讯云轻量服务器镜像安装宝塔Linux面板怎么使用?

腾讯云轻量应用服务器宝塔面板怎么用?轻量应用服务器如何安装宝塔面板?在镜像中选择宝塔Linux面板腾讯云专享版,在轻量服务器防火墙中开启8888端口号,然后远程连接到轻量服务器执行宝塔面板账号密码查询命令,最后登录和…

【P31】JMeter 循环控制器(Loop Controller)

这文章目录 一、循环控制器(Loop Controller)参数说明二、测试计划设计2.1、设置循环次数2.2、勾选永远2.3、设置线程组的持续时间 一、循环控制器(Loop Controller)参数说明 可以对部分逻辑按常量进行循环迭代 选择线程组右键 …

Lua学习笔记:C/C++和Lua的相互调用

前言 本篇在讲什么 C/C和Lua的相互调用 本篇适合什么 适合初学Lua的小白 适合需要C/C和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文教学 重实践,轻理论&…

【2023 · CANN训练营第一季】基于昇腾910的TF网络脚本训练(ModelArts平台)

准备工作: 1.注册华为云账号,获取AK/SAK,授权ModelArts,并申请华为云代金券 2.获取训练数据集,并进行数据预处理,比如离线制作成tfrecords(建议,可选) 3.将数据集(训练脚本)上传到OBS 4.安装PycharmIDE及To…

Word控件Spire.Doc 【其他】教程(4):在 Word 中插入上标和下标

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

注意力Transformer

注意力 注意力分为两步: 计算注意力分布 α \alpha α 其实就是,打分函数进行打分,然后softmax进行归一化 根据 α \alpha α来计算输入信息的加权平均(软注意力) 其选择的信息是所有输入向量在注意力下的分布 打…

Docker 设置国内镜像源

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到网络问题,此时可以配置国内的镜像加速来下载。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如如下: 科大镜像:https://docker.mirrors.ustc.edu.cn/网易&#…

ATA-4014高压功率放大器驱动超声马达测试应用

ATA-4014 高压功率放大器简介 ATA-4014是一款理想的可放大交、直流信号的单通道高压功率放大器。最大输出160Vp-p(80Vp)电压,452Wp功率,可以驱动高压功率型负载。电压增益数控可调,一键保存常用设置,为您提…

抽象轻松js

重复声明 经过了这么久,对声明变量应该差不多了解了,再加上之前了解的作用域 我们现在开始如果科学的使用重复声明 先复习一边(遍)作用域 var的作用域是全局 let、const的作用域是花括号 了解这点,那么科学使用重复声明就是合理使用作用…

C++11之atomic原子操作

atomic介绍 多线程间是通过互斥锁与条件变量来保证共享数据的同步的,互斥锁主要是针对过程加锁来实现对共享资源的排他性访问。很多时候,对共享资源的访问主要是对某一数据结构的读写操作,如果数据结构本身就带有排他性访问的特性&#xff0c…

如何用chatGPT赚钱?

赚钱思路 1)初级-账号 对于新事物的出现,很多人对此都是抱着一个看热闹的态度,大家对于这个东西的整体认知水平是很低的! 所以这个时候的思路就是快速去抢占市场,去各个平台发一些和ChatGPT相关的视频和文章去抢占市…

css、js(vue)进行textarea自适应高度(超详细说明)

文章目录 需求——如下图一、纯css 的自适应高度(有问题,不推荐)1.css代码2. html代码3. 代码截图说明4. 效果和会出现的问题 二、js 的自适应高度0.思路1.代码1. css代码2. html代码3. js代码 2.代码说明3.注意点导致的问题(0&am…

GP05丨多因子IC对冲

量化策略开发,高质量社群,交易思路分享等相关内容 大家好,今天我们分享股票社群第5期量化策略——多因子IC对冲。 在前几期中,我们分享了GP01多因子、ETF轮动策略及Plus版本、网格等等。本期我们继续分享多因子策略。 策略背景与…

【P32】JMeter While 控制器(While Controller)

文章目录 一、While 控制器(While Controller)参数说明二、测试计划设计2.1、变量2.2、函数2.2.1、groovy脚本2.2.2、jex13脚本2.2.3、js脚本 一、While 控制器(While Controller)参数说明 可以对部分逻辑按变量条件进行循环迭代…

CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)

文章目录 1、CentOS安装OpenSSL1.1.1(前置环境)2、CentOS安装 Python 3.103、创建虚拟环境4、运行Django项目 1、CentOS安装OpenSSL1.1.1(前置环境) 编译安装Python3.10时需要openssl1.1.1 查看当前版本 & 删除openssl1.0 …

代码随想录算法训练营第三十九天 | 力扣 62.不同路径, 63. 不同路径 II

62.不同路径 题目 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多…

C++数据结构:二叉树之一(数组存储)

文章目录 前言一、二叉树的基本定义二、二叉树的基本性质三、二叉树的存储(数组)总结原创文章,未经许可,禁止转载 前言 树是一种非线性数据结构,它由若干个节点和边组成。每个节点都有一个值,而边则表示节…

day17 - 用形状包围图像

在进行图像轮廓提取时,有的情况下不需要我们提取出精确的轮廓,只要提取出一个接近于轮廓的近似多边形,就可以满足后续的操作。 本期我们来学习如何通过设置参数来找出图像的近似多边形。 完成本期内容,你可以: 了解…

算法基础学习笔记——⑨C++STL使用技巧

✨博主:命运之光 ✨专栏:算法基础学习 目录 ✨CSTL简介 ✨CSTL使用技巧 前言:算法学习笔记记录日常分享,需要的看哈O(∩_∩)O,感谢大家的支持! ✨CSTL简介 vector变长数组,倍增的思想//系统为…