Gin学习笔记

news2024/11/27 17:37:11

Gin学习笔记

Gin文档:https://pkg.go.dev/github.com/gin-gonic/gin

1、快速入门

1.1、安装Gin

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

1.2、main.go

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	// 创建路由引擎
	r := gin.Default()

	// 添加路由监听
	r.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello Gin!")
	})

	//启用 web 服务
	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

在这里插入图片描述

2、配置热更新

Air文档:https://github.com/cosmtrek/air

2.1、下载

# 添加air包
go get -u github.com/cosmtrek/air
# 编译并安装air到 $GOPATH/bin 目录(重启一下Goland)
go install github.com/cosmtrek/air@latest

2.2、使用

# 直接使用air即可热加载
air

3、响应数据

3.1、String

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	r.LoadHTMLGlob("./template/*.html")

	r.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello Gin!")
	})
	r.GET("/hello", func(c *gin.Context) {
		//c.JSON(http.StatusOK, map[string]interface{}{
		//	"name": "xumeng03",
		//	"age":  "24",
		//})

		c.JSON(http.StatusOK, gin.H{
			"name": "xumeng03",
			"age":  "24",
		})
	})
	r.GET("/gin", func(c *gin.Context) {
		c.HTML(http.StatusOK, "gin.html", gin.H{
			"path": c.FullPath(),
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

3.2、JSON

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	r.GET("/hello", func(c *gin.Context) {
		//c.JSON(http.StatusOK, map[string]interface{}{
		//	"name": "xumeng03",
		//	"age":  "24",
		//})

		c.JSON(http.StatusOK, gin.H{
			"name": "xumeng03",
			"age":  "24",
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

3.3、HTML

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	r.LoadHTMLGlob("./template/*.html")

	r.GET("/gin", func(c *gin.Context) {
		c.HTML(http.StatusOK, "gin.html", gin.H{
			"path": c.FullPath(),
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Gin Study</title>
</head>
<body>
<h1>Gin Study!</h1>
<p>请求路径:{{.path}}</p>
</body>
</html>

4、请求数据

4.1、Get

1、直接查询
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
		// Query 查询 request 的参数,DefaultQuery 同样查询 request 的参数但若未查询到则赋一个默认值
		//var name = c.Query("name")
		var name = c.DefaultQuery("name", "Gin")
		c.String(http.StatusOK, "Hello %s!", name)
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

2、绑定到结构体
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
		var person = Person{}
		err := c.ShouldBind(&person)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"status":  500,
				"message": "Params Error!",
			})
            return
		}
		c.JSON(http.StatusOK, gin.H{
			"status": 200,
			"data":   person,
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

type Person struct {
	Name string `json:"name" form:"name"`
	Age  string `json:"age" form:"age"`
}

4.2、Post

1、直接查询
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	r.POST("/", func(c *gin.Context) {
		// PostForm 查询 request 的参数,DefaultPostForm 同样查询 request 的参数但若未查询到则赋一个默认值
		var name = c.PostForm("name")
		var age = c.DefaultPostForm("age", "20")
		c.String(http.StatusOK, "Hello %s %s!", name, age)
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
2、绑定到结构体(form-data)
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	r.POST("/", func(c *gin.Context) {
		var person = Person{}
		err := c.ShouldBind(&person)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"status":  500,
			})
            return
		}
		c.JSON(http.StatusOK, gin.H{
			"status":  500,
			"data": person,
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

type Person struct {
	Name string `json:"name" form:"name"`
	Age  string `json:"age" form:"age"`
}
3、绑定到结构体(json)
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	r.POST("/json", func(c *gin.Context) {
		var person = Person{}
		err := c.ShouldBindJSON(&person)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"status": 500,
			})
			return
		}
		c.JSON(http.StatusOK, gin.H{
			"status": 200,
			"data":   person,
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

type Person struct {
	Name string `json:"name" form:"name"`
	Age  string `json:"age" form:"age"`
}

5、Restful

http://127.0.0.1/item/1 查询,GET

http://127.0.0.1/item 新增,POST

http://127.0.0.1/item 更新,PUT

http://127.0.0.1/item/1 删除,DELETE

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	r.GET("/get/:name", func(c *gin.Context) {
		param := c.Param("name")
		c.String(http.StatusOK, "Hello get %s!", param)
	})

	r.POST("/post/:name", func(c *gin.Context) {
		param := c.Param("name")
		c.String(http.StatusOK, "Hello post %s!", param)
	})

	r.PUT("/put/:name", func(c *gin.Context) {
		param := c.Param("name")
		c.String(http.StatusOK, "Hello put %s!", param)
	})

	r.DELETE("/delete/:name", func(c *gin.Context) {
		param := c.Param("name")
		c.String(http.StatusOK, "Hello delete %s!", param)
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

6、路由分组

6.1、基本使用

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	group := r.Group("/restful0")
	{
		group.GET("/get/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello get %s!", param)
		})

		group.POST("/post/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello post %s!", param)
		})
	}

	group1 := r.Group("/restful1")
	{
		group1.PUT("/put/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello put %s!", param)
		})

		group1.DELETE("/delete/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello delete %s!", param)
		})
	}

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

6.2、拆分文件

package main

import (
	"ginstudy/router"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	router.Restful0(r)
	router.Restful1(r)

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
package router

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func Restful0(r *gin.Engine) {
	group := r.Group("/restful0")
	{
		group.GET("/get/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello get %s!", param)
		})

		group.POST("/post/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello post %s!", param)
		})
	}
}
package router

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func Restful1(r *gin.Engine) {
	group1 := r.Group("/restful1")
	{
		group1.PUT("/put/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello put %s!", param)
		})

		group1.DELETE("/delete/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello delete %s!", param)
		})
	}
}

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

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

相关文章

打通你学习C语言的任督二脉-函数栈帧的创建和销毁(上)

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:C语言学习&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 待解决疑惑: 局部变量是怎么创建的? 为什么局部变量的值是随机值? 函数是怎么传参的?传参的顺序是怎样的? 形参和实参是什么关系? 函数调…

3.25每日一题(知线性常系数方程的特解求线性方程)

思路&#xff1a;通过特解可以知道特征根&#xff0c;通过特征根可以求出特征方程&#xff0c;通过特征方程可以求出线性方程

C语言strcat函数再学习

之前学习了strcat函数&#xff1b;下面继续学习此函数&#xff1b; 它的功能描述是&#xff0c; 功能 把src所指向的字符串&#xff08;包括“\0”&#xff09;复制到dest所指向的字符串后面&#xff08;删除*dest原来末尾的“\0”&#xff09;。要保证*dest足够长&#xff0…

【数智化人物展】觉非科技CEO李东旻:数据闭环,智能驾驶数智时代发展的新引擎...

李东旻 本文由觉非科技CEO李东旻投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 数智化的主要作用是帮助决策。它的核心是大数据&#xff0c;以大数据为基础&#xff0c;匹配合适的AI技术&#xff0c;促使数…

Framebuffer 介绍和应用编程

前言&#xff1a; 使用的开发板为韦东山老师的 IMX6ULL 目录 Framebuffer介绍 LCD 操作原理 涉及的 API 函数 1.open 函数 2.ioctl 函数 3.mmap 函数 Framebuffer 程序分析 1.打开设备 2.获取 LCD 参数 3.映射 Framebuffer 4.描点函数 5.随便画几个点 6.上机实验…

一个高性能类型安全的.NET枚举实用开源库

从零构建.Net前后端分离项目 枚举应该是我们编程中&#xff0c;必不可少的了&#xff0c;今天推荐一个.NET枚举实用开源库&#xff0c;它提供许多方便的扩展方法&#xff0c;方便开发者使用开发。 01 项目简介 Enums.NET是一个.NET枚举实用程序库&#xff0c;专注于为枚举提…

【技术干货】开源库 Com.Gitusme.Net.Extensiones.Core 的使用

目录 1、项目介绍 2、为项目添加依赖 3、代码中导入命名空间 4、代码中使用 示例 1&#xff1a;string转换 示例 2&#xff1a;object转换 1、项目介绍 Com.Gitusme.Net.Extensiones.Core是一个.Net扩展库。当前最新版本1.0.4&#xff0c;提供了常见类型转换&#xff0c…

坐公交:内外向乘客依序选座(python字典、字符串、元组)

n排宽度不一的座位&#xff0c;每排2座&#xff0c;2n名内外向乘客依序上车按各自喜好选座。 (笔记模板由python脚本于2023年11月05日 21:49:31创建&#xff0c;本篇笔记适合熟悉python列表list、字符串str、元组tuple的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&…

从公共业务提取来看架构演进——帐号权限篇

1. 引言 在产品业务多元化的过程中&#xff0c;往往会遇到一些与业务发展不匹配的架构问题&#xff0c;这些问题可能会在业务迭代中以性能差、重复开发等形式表现出来&#xff0c;进而给系统的扩展和维护带来一些挑战。 本文准备以一个帐号权限的业务为例&#xff0c;来讨论下…

SQL FULL OUTER JOIN 关键字(完整外部连接)||SQL自连接 Self JOIN

SQL FULL OUTER JOIN 关键字 当左&#xff08;表1&#xff09;或右&#xff08;表2&#xff09;表记录匹配时&#xff0c;FULL OUTER JOIN关键字将返回所有记录。 注意&#xff1a; FULL OUTER JOIN可能会返回非常大的结果集&#xff01; SQL FULL OUTER JOIN 语法 SELECT …

[100天算法】-搜索旋转排序数组(day 60)

题目描述 升序排列的整数数组 nums 在预先未知的某个点上进行了旋转&#xff08;例如&#xff0c; [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] &#xff09;。请你在数组中搜索 target &#xff0c;如果数组中存在这个目标值&#xff0c;则返回它的索引&#xff0c;否…

计算机毕设 基于大数据的服务器数据分析与可视化系统 -python 可视化 大数据

文章目录 0 前言1 课题背景2 实现效果3 数据收集分析过程**总体框架图****kafka 创建日志主题****flume 收集日志写到 kafka****python 读取 kafka 实时处理****数据分析可视化** 4 Flask框架5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&a…

MATLAB和西门子SMART PLC UDP通信

MATLAB和SMART PLC的OPC通信请参考下面文章链接,这里不再赘述: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读661次,点赞26次,收藏2次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的o…

Spring Security入门教程,springboot整合Spring Security

Spring Security是Spring官方推荐的认证、授权框架&#xff0c;功能相比Apache Shiro功能更丰富也更强大&#xff0c;但是使用起来更麻烦。 如果使用过Apache Shiro&#xff0c;学习Spring Security会比较简单一点&#xff0c;两种框架有很多相似的地方。 目录 一、准备工作 …

“Java与Redis的默契舞曲:优雅地连接与存储数据“

文章目录 引言1. Java连接上Redis2. Java对Redis进行存储数据2.1 存储set类型数据2.2 存储hash类型数据2.3 存储list类型数据 总结 引言 在现代软件开发中&#xff0c;数据存储和处理是至关重要的一环。Java作为一门强大的编程语言&#xff0c;与Redis这个高性能的内存数据库相…

【PWN · heap | unlink】hitcon2014_stkof

初学&#xff0c;通过一道题初步掌握unlink。不教学unlink的具体过程&#xff0c;仅是一篇wp记录笔记 前言 教学和具体过程可以看这个大佬的博客&#xff1a; buuctf pwn hitcon2014_stkof 初识unlink_buuctf hitcon2014_stkof-CSDN博客 一、题目 fill函数可读大量字符&#…

正点原子嵌入式linux驱动开发——Linux WIFI驱动

WIFI的使用已经很常见了&#xff0c;手机、平板、汽车等等&#xff0c;虽然可以使用有线网络&#xff0c;但是有时候很多设备存在布线困难的情况&#xff0c;此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI&#xff0c;本章就来学习一下如何…

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …

基于前馈神经网络完成鸢尾花分类

目录 1 小批量梯度下降法 1.0 展开聊一聊~ 1.1 数据分组 1.2 用DataLoader进行封装 1.3 模型构建 1.4 完善Runner类 1.5 模型训练 1.6 模型评价 1.7 模型预测 思考 总结 参考文献 首先基础知识铺垫~ 继续使用第三章中的鸢尾花分类任务&#xff0c;将Softm…

OCS2工具箱

实时系统优化控制工具箱 参考视频&#xff1a;ETH 最优控制/MPC 实时求解器 OCS2 使用入门 参考文档&#xff1a;OCS2 求解器入门 选择OCS2 OCS2 是一个 MPC 实时求解器 (SLQ/iLQR)&#xff0c;依赖 Pinocchio 构建机器人动力学模型&#xff0c;采用 RViz 或者 RaiSim 验证 (…