gin 框架初始教程文档
一 、gin 入门
1. 安装gin :下载并安装 gin包:
$ go get -u github.com/gin-gonic/gin2. 将 gin 引入到代码中:
import "github.com/gin-gonic/gin"3.初始化项目
go mod init gin4.完整代码
package mainimport "github.com/gin-gonic/gin"func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})r.Run()
}
5.启动项目
go run main.go # 运行 main.go 并且在浏览器中访问 0.0.0.0:8080/ping6.效果图


二、基础知识
go get -u
参数介绍:
-d 只下载不安装
-f 只有在你包含了 -u 参数的时候才有效,不让 -u 去验证 import 中的每一个都已经获取了,这对于本地 fork 的包特别有用
-fix 在获取源码之后先运行 fix,然后再去做其他的事情
-t 同时也下载需要为运行测试所需要的包
-u 强制使用网络去更新包和它的依赖包
-v 显示执行的命
三、gin测试用例
AsciiJSON 生成具有转义的非 ASCII 字符的 ASCII-only JSON。
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r:=gin.Default()r.GET("/someJson", func(c *gin.Context) {data:=map[string]interface{}{"lang":"go 语言","tag":"<br>",}c.AsciiJSON(http.StatusOK,data)})r.Run(":8081")
}


为什么 浏览器和 终端命令行curl打印出来的结果格式不一样?gin.AsciiJSON
答:编码问题
绑定HTML复选框
package mainimport "github.com/gin-gonic/gin"type myForm struct {Colors []string `form:"colors[]"`
}func formHandler(c *gin.Context) {var fakeForm myFormc.ShouldBind(&fakeForm)c.JSON(200, gin.H{"color": fakeForm.Colors})
}func innerHandler(c *gin.Context) {c.HTML(200, "form.html", nil)
}func main() {r := gin.Default()r.LoadHTMLGlob("views/*")r.GET("/", innerHandler)r.POST("/", formHandler)r.Run(":8082")
}
views/form.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/" method="POST"><p>Check some colors</p><label for="red">Red</label><input type="checkbox" name="colors[]" value="red" id="red"><label for="green">Green</label><input type="checkbox" name="colors[]" value="green" id="green"><label for="blue">Blue</label><input type="checkbox" name="colors[]" value="blue" id="blue"><input type="submit">
</form>
</body>
</html>

绑定查询字符串或表单数据
package mainimport ("github.com/gin-gonic/gin""log""time"
)
//表单字符串
type PersonString struct {Name string `form:"name"`Address string `form:"address" `Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"`
}//请求json格式
type PersonJson struct {Name string `json:"name"`Address string `json:"address"`Birthday time.Time `json:"birthday" time_format:"2006-01-02" time_utc:"1"`
}func startPage(c *gin.Context) {var person PersonStringerr := c.Bind(&person)//ShouldBind 与 Bind 打印结果一样//err:=c.ShouldBind(&person)if err == nil {log.Println(person.Name)log.Println(person.Address)log.Println(person.Birthday)log.Println("Binding success...")} else {log.Println("Binding failed...")log.Println(err)}var personJson PersonJsonerrJson := c.BindJSON(&personJson)if errJson == nil {log.Println(personJson.Name)log.Println(personJson.Address)//log.Println(personJson.Birthday)log.Println("BindJson success...")} else {log.Println("BindJson failed...")log.Println(errJson)}c.String(200, "success")
}
func main() {log.Println("Hello World")route := gin.Default()route.GET("/testing", startPage)route.Run(":8083")
}
请求:
string:
curl -X GET "http://0.0.0.0:8083/testing?name=appleboy&address=xyz&birthday=2023-03-15"
打印:结果
success 
josn:
curl -X GET "http://0.0.0.0:8083/testing" --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"结果:success
效果图:

绑定uri
package mainimport "github.com/gin-gonic/gin"type Person struct {ID string `uri:"id" building:"required,uuid"`Name string `uri:"name" building:"required"`
}func main() {r := gin.Default()r.GET("/:name/:id", func(c *gin.Context) {var person Personif err := c.ShouldBindUri(&person); err != nil {c.JSON(400, gin.H{"msg": err})return}c.JSON(200, gin.H{"name": person.Name, "uuid": person.ID})})r.Run(":8080")}
控制log 高亮输出,默认开启高亮
//强制log 高亮
gin.ForceConsoleColor()//关闭log高亮
//gin.DisableConsoleColor()
6.自定义http配置:(监听端口,读写时间,最大读写字节数)
func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})//两行作用一样,谁先执行谁生效//r.Run(":8080")//http.ListenAndServe(":8081",r)s := &http.Server{Addr: ":8084",Handler: r, //实例句柄ReadTimeout: 10 * time.Second,WriteTimeout: 10 * time.Second,MaxHeaderBytes: 1 << 20,}s.ListenAndServe()
}自定义log文件
func main() {r := gin.New()r.Use(gin.LoggerWithFormatter(func(params gin.LogFormatterParams) string {return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",params.ClientIP,params.TimeStamp.Format(time.RFC3339),params.Method,params.Path,params.Request.Proto,params.StatusCode,params.Latency,params.Request.UserAgent(),params.ErrorMessage,)}))r.Use(gin.Recovery())r.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})r.Run(":8080")
}
自定义中间件
//自定义中间件
func logger() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()//设置变量c.Set("lxw", "this is string")c.Set("lxwInt", 123456789)//请求前c.Next()//请求后latency := time.Since(t)log.Println(latency) //花费时间//获取发送的codestatusCode := c.Writer.Status()log.Println(statusCode)}
}
func main() {r := gin.New()r.Use(logger()) //引用(相当于include)r.GET("/test", func(c *gin.Context) {/*** MustGet returns the value for the given key if it exists, otherwise it panics.返回给定键的值(如果存在),否则会死机*/varInt := c.MustGet("lxwInt").(int) //int 是对变量lxwInt 的限制要求,若不是int则报错varString := c.GetString("lxw")log.Println(varInt,varString)})r.Run(":8080")
}
自定义验证器
//自定义验证器
//输入和输出日期必填;输出日期大于输入日期;输入和输出日期符合自定的验证器(日期需在今天日期之后)type Booking struct {CheckIn time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"`CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn bookabledate" time_format:"2006-01-02"`
}//验证器
var bookableDate validator.Func = func(fl validator.FieldLevel) bool {date, ok := fl.Field().Interface().(time.Time)if ok {today := time.Now()if today.After(date) {return false}}return true
}func getBookable(c *gin.Context) {var b Bookingif err := c.ShouldBindWith(&b, binding.Query); err == nil {c.JSON(http.StatusOK, gin.H{"message": "book data is validate"})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func main() {r := gin.Default()if v, ok := binding.Validator.Engine().(*validator.Validate); ok {v.RegisterValidation("bookabledate", bookableDate)}r.GET("/bookable", getBookable)r.Run(":8080")
}
请求地址:输入和输出日期必填;输出日期大于输入日期;输入和输出日期符合自定的验证器(日期需在今天日期之后)
http://0.0.0.0:8080/bookable?check_in=2023-02-08&check_out=2023-03-09
定义路由日志格式
//定义路由日志格式
func main() {r := gin.Default()gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) {log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers)}r.POST("/aaa", func(c *gin.Context) {c.JSON(http.StatusOK, "aaa")})r.GET("/bbb", func(c *gin.Context) {c.JSON(http.StatusOK, "bbb")})r.GET("/ccc", func(c *gin.Context) {c.JSON(http.StatusOK, "ccc")})r.Run()
}
优雅的关机或重启
//优雅的关机或重启
func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {time.Sleep(5 * time.Second)c.String(http.StatusOK, "welcome server")})srv := &http.Server{Addr: ":8080",Handler: r,}go func() {//服务连接:打印链接错误信息if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {log.Fatalf("listen: %s \n", err)}}()//等待中断信号优雅关闭服务器(设置5秒的超时时间)quit := make(chan os.Signal)signal.Notify(quit, os.Interrupt)<-quitlog.Println("shutdown server...")ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)defer cancel()//关机失败原因if err := srv.Shutdown(ctx); err != nil {log.Fatal("server shutdown:", err)}log.Println("server exiting")
}
路由组
func main() {r := gin.Default()v1 := r.Group("/v1"){v1.GET("/aa", loginEndpoint)v1.GET("/bb", exit)}r.Run()
}func loginEndpoint(c *gin.Context) {c.String(200,"hello")
}func exit( context2 *gin.Context) {context2.String(200,"world")
}

记录日志到文件和控制台(默认直接打印在控制台)
func main() {//禁用控制台颜色,将日志写入文件时不需要控制台颜色(加不加无所谓)//gin.DisableConsoleColor()//创建日志文件fileName, _ := os.Create("gin.log")//将日志并发写入文件gin.DefaultWriter = io.MultiWriter(fileName)//将日志同时写入文件和控制台//gin.DefaultWriter = io.MultiWriter(fileName, os.Stdout)r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})r.Run()
}
参考:https://learnku.com/docs/gin-gonic/1.7/examples-bind-uri/11391
相关文章:
gin 框架初始教程文档
一 、gin 入门1. 安装gin :下载并安装 gin包:$ go get -u github.com/gin-gonic/gin2. 将 gin 引入到代码中:import "github.com/gin-gonic/gin"3.初始化项目go mod init gin4.完整代码package mainimport "github.com/gin-go…...
Maven的下载和安装【详细】
文章目录一、什么是Maven?二、Maven的安装与配置2.1下载Maven安装包2.2配置Maven环境变量2.3验证三、Idea配置Maven3.1配置 setting.xml文件3.2Idea配置Maven一、什么是Maven? Apache Maven是个项目管理和自动构建工具,基于项目对象模型&…...
[数据结构]:04-循环队列(数组)(C语言实现)
目录 前言 已完成内容 循环队列实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-QueueCommon.cpp 04-QueueFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代码。使用C引用主要是为了…...
buu [GWCTF 2019]BabyRSA 1
题目描述: import hashlib import sympy from Crypto.Util.number import *flag GWHT{******} secret ******assert(len(flag) 38)half len(flag) / 2flag1 flag[:half] flag2 flag[half:]secret_num getPrime(1024) * bytes_to_long(secret)p sympy.nextp…...
codeforces 1669F
题意: alice和bob从数组两边的吃糖果, 数组的值就是糖果重量 要求alice和bob吃的糖果重量必须一样, 输出能吃几个糖果 这题最先想到的是前后缀相加 模拟一个前缀和 和 后缀和 在n/2的位置向前找前缀和 在n/2的位置向后找后缀和 找到第一个前缀和后缀和的下标输出就好 …...
高数考试必备知识点
三角函数与反三角函数的知识点 正弦函数 ysin x, 反正弦函数 yarcsin x • y sin x, x∈R, y∈[–1,1],周期为2π,函数图像以 x (π/2) kπ 为对称轴 • y arcsin x, x∈[–1,1]…...
[蓝桥杯] 二分与前缀和习题练习
文章目录 一、二分查找习题练习 1、1 数的范围 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 机器人跳跃问题 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 四平方和 1、3、1 题目描述 1、3、2 题解关键思路与解答 二、前缀和习题练习 2、1 前缀和 2、1、1 题目描述…...
SpringMvc中HandlerAdapter组件的作用
概述 我们在使用springMVC时,都知道其中不仅包含handlerMapping组件还包含handlerAdapter组件,为什么呢? springMVC请求流程图 HandlerAdapter组件使用了适配器模式 适配器模式的本质是接口转换和代码复用,这里使用适配器模式的…...
FreeRTOS优先级翻转
优先级翻转优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未…...
服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】
我是用的xshell连接的云服务器,今天想在服务器上面部署一个前后端分离【springbootvue】项目,打开我的云服务器才发现,过期了,然后又买了一个,里面环境啥都没有,正好出一期教程,方便大家也方便自…...
golang项目----家庭收支记账软件
家庭收支记账软件实现基本功能(先使用面向过程,后面改成面向对象)项目代码实现改进面向过程源码面向对象源码utils包中main包中实现基本功能(先使用面向过程,后面改成面向对象) 编写文件TestMyAccount.go完成基本功能 功能一:先完成可以显示…...
中国LNG市场投资机会研究
中国LNG市场投资机会研究中国LNG市场是一个具有巨大潜力和发展机遇的市场,尤其是在政府大力推动清洁能源发展的背景下,LNG市场投资机会正在不断扩大。首先,政府大力支持LNG市场的发展。政府实施的“十三五”规划将LNG作为清洁能源的重要来源&…...
Elasticsearch:索引数据是如何完成的
在我在之前的文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作” 文章中,我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中,我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…...
处理器管理
处理器状态处理器管理是操作系统中重要组成部分,负责管理、调度和分配计算机系统的重要资源——处理器,并控制程序执行由于处理器管理是操作系统最核心的部分,无论是应用程序还是系统程序,最终都要在处理器上执行以实现其功能&…...
跟着我从零开始入门FPGA(一周入门系列)第五
5、同步和异步设计 前面已有铺垫,同步就是与时钟同步。 同步就是走正步,一二一,该迈哪个脚就迈那个脚,跑的快的要等着跑的慢的。 异步就是搞赛跑,各显神通,尽最大力量去跑,谁跑得快,…...
【第42天】Arrays.sort 与 Collections.sort 应用 | 整形数组与集合的排序
本文已收录于专栏🌸《Java入门一百练》🌸学习指引序、专栏前言一.sort函数二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析三、推荐专栏序、专栏前言 本专栏开启,目的…...
LeetCode第334场周赛
2023.2.26LeetCode第334场周赛 A. 左右元素和的差值 思路 前缀和后缀和 代码 class Solution { public:vector<int> leftRigthDifference(vector<int>& nums) {int n nums.size();vector<int> l(n), r(n), ans(n);for (int i 1; i < n; i )l[…...
基于深度学习的三维重建网络PatchMatchNet(三):PatchMatchNet配置及代码主要运行流程
目录 1.PatchMatchNet环境配置 2. PatchMatchNet的大致执行流程(eval.py) 2.1 深度图的保存...
【一天一门编程语言】设计一门编程语言,给出基础语法代码示例,SDK设计。
文章目录设计一门编程语言,给出基础语法代码示例,SDK设计。一、编程语言设计1.1 语言名称1.2 数据类型1.3 基本运算符1.4 控制语句二、SDK设计2.1 基础库2.2 第三方库三、例子用 Mango 这门语言实现斐波那契数列。基础语法代码示例SDK 设计使用 Mango 语…...
ubuntu 下 python 安装 venv
ubuntu 下 python 安装 venv1.首先,确保您的系统已安装 Python3 和 pip3,如果没有安装,可以使用以下命令安装:2. 接着,安装 virtualenv 包,使用以下命令:3.创建 Python 虚拟环境,使用…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
