[GO] Gin入门

news2025/1/4 21:42:56

1. Gin基本使用

1.1 Gin入门

  • Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
  • 对于Golang而言,web框架的依赖要远比Python,Java之类要小,自身的net/http足够简单,性能也非常不错
  • 借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范.

1.2 安装

要安装Gin 软件包,需要先安装GO并设置Go工作区.

  1. 首先需要安装GO,然后可以使用GO命令安装Gin.在go.mod同级目录执行以下命令.
go get -u github.com/gin-gonic/gin

3.Gin入门与源码

一共需要3步.

  1. 创建路由
  2. 路由绑定
  3. 启动监听
func main() {
	// 1. 创建路由
	r := gin.Default()
	// 2. 路由绑定
	r.GET("/", func(c *gin.Context) {
		c.String(200, "ok")
	})
	// 3. 启动监听
	fmt.Println("http://192.168.31.1:8080")
	r.Run(":8080")
}

请添加图片描述

1.3 gin核心概念

  • Engine 容器对象,整个框架基础
  • Engine.trees 负责存储路由和handle方法的映射,采用类似字典树的结构
  • Engine.RouterGroup 其中Handlers存储着所有中间件
  • Context上下文对象,负责处理请求和回应,其中handlers是存储处理请求时中间件和处理方法的.

请添加图片描述

2. gin 路由

2.1 无参路由

不传递任何数据

func main() {
	// 1. 定义路由
	r := gin.Default()
	// 2. 定义路由
	r.GET("/hello", HelloHandler)
	// 3. 启动监听
	fmt.Println("http://192.168.31.1:8080/hello")
	r.Run(":8080")
}

func HelloHandler(c *gin.Context) {
	c.String(200, "hello world")
}

2.2 Api传参

func main() {
	// 1. 定义
	r := gin.Default()
	r.GET("/book/:id", GetBookHandler)
	fmt.Println("http://localhost:8080/")
	r.Run(":8080")
}

func GetBookHandler(c *gin.Context) {
	bookID := c.Param("id")
	fmt.Println(bookID, "------->")
	book := "你找的书:" + bookID + "已经找到\n"
	c.String(200, book)
}

请添加图片描述

2.3 Url传参

func main() {
	r := gin.Default()
	r.GET("/user", UrlGetHandler)
	fmt.Println("http://192.168.31.1:8080/")
	r.Run(":8080")
}
func UrlGetHandler(c *gin.Context) {
	username := c.Query("username")
	password := c.Query("password")
	output := "你输入的用户名是:" + username + "   密码是:" + password
	c.String(200, output)
}

请添加图片描述

设置默认值

func main() {
	r := gin.Default()
	r.GET("/user", UrlGetHandler)
	fmt.Println("http://192.168.31.1:8080/")
	r.Run(":8080")
}
func UrlGetHandler(c *gin.Context) {
	username := c.Query("username")
	//password := c.Query("password")
	password := c.DefaultQuery("password", "你没有输入密码")
	output := "你输入的用户名是:" + username + "   密码是:" + password
	c.String(200, output)
}

如果这里没有传值就会用默认值替代

请添加图片描述

如果传入值,那么就用传入的值.

请添加图片描述

2.4 shouldBind

用来解析Post请求中复杂的Json数据

func main() {
	r := gin.Default()
	r.POST("/user/login", LoginHandler)
	r.Run(":8080")
}

type Login struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

func LoginHandler(c *gin.Context) {
	var login Login
	if err := c.ShouldBind(&login); err != nil {
		c.String(400, "err")
        return
  	}
	Code := login.Username + "  Login Succeeded!"
	c.String(200, Code)
}

请添加图片描述

也可以将某个参数设为必须

func main() {
	r := gin.Default()
	r.POST("/user/login", LoginHandler)
	r.Run(":8080")
}

type Login struct {
	Username string `json:"username" binding:"required"`
	Password string `json:"password" binding:"required"`
}

func LoginHandler(c *gin.Context) {
	var login Login
	if err := c.ShouldBind(&login); err != nil {
		fmt.Println(err)
		c.String(400, "err")
		return
	}
	Code := login.Username + "  Login Succeeded!"
	c.String(200, Code)
}

当没有传该参数时就会报错

请添加图片描述

3. 数据返回Response

3.1 String字符串返回

func main() {
	r := gin.Default()
	r.GET("/response", ResponseHandler)
	r.Run(":8080")
}
func ResponseHandler(c *gin.Context) {
	msg := "success response"
	c.String(200, msg)
}

请添加图片描述

3.2 返回Json数据

func main() {
	r := gin.Default()
	r.GET("/response", JsonHandler)
	r.Run(":8080")
}
func JsonHandler(c *gin.Context) {
	type Data struct {
		Msg  string `json:"msg"`
		Code int    `json:"code"`
	}
	d := Data{
		Msg:  "success",
		Code: 200,
	}
	c.JSON(200, d)
}

请添加图片描述

3.3 直接通过gin.H返回

直接用gin.H将json数据进行返回,返回效果和上面效果一样

func JsonHandler(c *gin.Context) {
	c.JSON(200, gin.H{
		"msg":  "success",
		"code": 200,
	})
}

3.4 路由重定向

func main() {
	r := gin.Default()
	r.GET("/response/json", JsonHandler)
	r.GET("/response/baidu", ResponseRedirHandler)
	r.Run(":8080")
}
func ResponseHandler(c *gin.Context) {
	msg := "success response"
	c.String(200, msg)
}
func JsonHandler(c *gin.Context) {
	c.JSON(200, gin.H{
		"msg":  "success",
		"code": 200,
	})
}
func ResponseRedirHandler(c *gin.Context) {
	c.Redirect(302, "https://www.baidu.com")
}

4. 路由分发

一个项目有非常多的模块,每个模块维护自己的路由.主路由在main.go中进行注册

初始化项目

go mod init demo_route_layer		// 初始化项目
go mod tidy 					  // 更新项目中使用的模块
go get github.com/gin-gonic/gin		// 下载go模块

main.go

import (
	"demo_route_layer/routers" // 导入本地模块
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	// 注册路由
	routers.LoadUsers(r)
	routers.LoadBook(r)

	r.Run(":8080")
}

routers/users.go

// 分层注册路由
func LoadUsers(r *gin.Engine) {
	r.GET("/user", UserHandler)

}

func UserHandler(c *gin.Context) {
	c.String(200, "用户模块分发")
}

routers/book

import "github.com/gin-gonic/gin"

func LoadBook(r *gin.Engine) {
	r.GET("/book", BooksHandler)
}
func BooksHandler(c *gin.Context) {
	c.String(200, "图书模块返回")
}

请添加图片描述

请添加图片描述

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

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

相关文章

为本地web服务配置使用固定的二级子域名【内网穿透】

由于使用免费的cpolar所生成的公网地址为随机临时地址,该地址24小时内会发生变化,对于需要长期访问的用户来讲比较不方便。 不过我们可以为其配置cpolar固定的二级子域名(该二级子域名可自定义),该地址不会随机变化&a…

芯片漫游指南(2)-- UVM结构

目录:1 组件家族1.1概述1.2 uvm_driver1.2.1 概述1.2.2 示例1.3 uvm_monitor1.3.1 概述1.3.2 示例1.4 uvm_sequencer1.4.1 概述1.4.2 示例1.5 uvm_agent1.5.1 概述1.5.2 示例1.6 uvm_scoreboard1.6.1 概述1.6.2 示例1.7 uvm_env1.7.1 概述1.7.2 示例1.8 uvm_test1.8…

天翎携手群晖助力电商行业文档管理

编者按:电商行业的文档管理怎么做?本文根据电商行业文档管理中存在的一些难点,提出天翎文档管理系统和群晖NAS结合的解决方案。 关键词:免安装,免维护,文件分类,权限设置,文件同步&…

【拿捏链表(Ⅱ)】—Leetcode删除排序链表中的重复元素

目录删除排序链表中的重复元素(Ⅰ)删除排序链表中的重复元素(Ⅱ)删除排序链表中的重复元素(Ⅰ) 题目: 给定一个已排序的链表的头 head ,删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 思路:这里的思路很简单&…

Navigation--导航算法(局部视野导航)--DWA、TAB

DWA 动态窗口法(dynamic window approach,DWA)目前与A*一样都是ROS导航包中提供的基本路径规划算法。DWA是一种贪心的算法,通过可选速度、可选角速度的组合,模拟出很多局部轨迹,然后选择最优的。这种方法时…

Android dex动态加载(Kotlin版)

前言 环境 语言–KotlinJDK11SDK33AndroidStudio版本 Android Studio Dolphin | 2021.3.1 Patch 1 Build #AI-213.7172.25.2113.9123335, built on September 30, 2022概述 libaray项目打包成jarjar通过dx命令行工具转为dex.jardex.jar放到assets目录下App启动读取assets中…

外贸业务12年,我想和大家分享这几点感受

如今再回看这段经历,很庆幸我的三观一直都很正确,那就是买家第一。 不管是什么原因,只要你想退,我都可以接受退,我不能退回上级供应商的那我就自己留着,只为了不想因为这一次拒绝而失去这个买家&#xff1…

springboot集成security(鉴权)

本文承接上一章节内容:springboot集成security(认证) 上一章节: https://blog.csdn.net/m0_54355172/article/details/128239128 1. 授予静态资源访问权限 因为我的演示案例涉及到多个页面,所以先说一下如何给静态资源…

数据挖掘——关联规则(Association Rule)Apriori算法和python代码实现

关联规则(Association Rule)什么是关联规则一些基本概念任务是什么Apriori 算法核心思想步骤与流程图如何找到候选集python代码实现什么是关联规则 关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘…

线程2的深度剖析

加锁 synchronized 1.修饰方法(普通方法,静态方法)普通方法实际上加到了this上,静态方法加到了类对象上。 2.修饰代码块 手动指定加到那个对象上 明确锁对象针对那个对象加锁,如果两个线程针对同一个对象加锁&am…

(1)AWD入门攻略大纲

1.比赛介绍 (1)比赛环境 (2)常见服务器信息介绍 比赛名称 白名单:一般用于防止外部恶意攻击,如果赛方发现名单以外IP可能会进行封禁处理。 服务器账号密码 Token和虚拟IP:token为提交答案的凭证,绑定了队伍;虚拟IP为…

SpringCloud中Feign注解@FeignClient参数一览表

写在前面 Feign是微服务中服务间调用的优选组件,后来的OpenFeign也是基于此来开展的。 为什么要梳理一下Feign注解FeignClient中的各个参数? 踩坑太多面试总问 参数一栏表 FeignClient的源码示例图如下: 今天我们接着来说最后的几个参数。…

Java面试题(六)美团JVM夺命7连问(灵魂拷问)

0.来看一道美团的面试题 这题直接把人给问懵逼了,你能全部答出来吗? Object o new Object();请解释对象的创建过程?DCL要不要加volatile问题?对象在内存中的存储布局?什么是指针压缩?对象头具体包含哪些…

生成树问题汇总

生成树问题汇总注1、最小(大)生成树思路代码例子:1、最小生成树结果是2、最大生成树结果2、在最小生成树中再加一条边,求新的最小生成树思路代码核心代码全部代码例子3、次小生成树思路:在上一个功能基础上进一步扩充代码核心代码全部代码例子4、判断最小…

一个轻量级的分布式日志标记追踪神器,十分钟接入,非常好用!

TLog简介 1、TLog通过对日志打标签完成企业级微服务的日志追踪。它不收集日志,使用简单, 产生全局唯一的追踪码。除了追踪码以外,TLog还支持SpanId和上下游服务信息 标签的追加。 2、为用户使用方便而设计,提供完全零侵入式接入…

es入门(上)

笔记来源于学习 b站中的【IT李老师】的elasticsearch课程 自己在实习做的es模块中的理解。 后续会有 中,下篇笔记更新,目前这一篇是上篇。 目录 Elastic Stack简介 1.1简介 1.2特色 1.3组件介绍 2.Elasticsearch的接收与核心概念 2.1搜索是什么…

【Keras+计算机视觉+Tensorflow】OCR文字识别实战(附源码和数据集 超详细必看)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、OCR文字识别简介 利用计算机自动识别字符的技术,是模式识别应用的一个重要领域。人们在生产和生活中,要处理大量的文字、报表和文本。为了减轻人们的劳动,提高处理效率,从…

[python]初步练习脚本

之前练习的python,编写的脚本,现在作为记录,方便查看~ python 初步练习脚本基础部分的练习脚本脚本代码1、helloworld.py,有for循环语句2、main.py3、range—test.py,范围4、RE.py,花式输出内容5、turtle练…

Jekins安装和部署

1.官网下载 注意jekins各版本不同支持jdk的版本也不同 https://www.jenkins.io/download/ 如图进去后可看见最新版,而past releases是历史版本 查看自己各版本的支持 我下载的是2.346.1版本,是war包形式 2.启动jekins 直接在war包路径 java命令启动…

lspci命令整理

1. 作用: 显示当前主机的所有PCI总线信息 2. 常用指令: lspci -nn 第一列的数字:总线编号(Bus Number):设备编号(Device Number):功能编号(Function Number) 第一个中括…