Gin学习笔记

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)
		})
	}
}

7、自定义控制器

7.1、目录结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.2、router

app.go

package app

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

func AppApi(r *gin.Engine) {
    group := r.Group("/app/api")
    appController := app.AppController{}

    group.GET("/", appController.Index)
}

web.go

package web

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

func WebApi(r *gin.Engine) {
    group := r.Group("/web/api")
    webController := web.WebController{}

    group.GET("/", webController.Index)
}

7.3、controller

app.go

package app

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

type AppController struct {
    controller.StandardController
}

func (app AppController) Index(c *gin.Context) {
    //c.String(http.StatusOK, "Hello App Api!")
    app.Success(c)
}

web.go

package web

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

type WebController struct {
    controller.StandardController
}

func (web WebController) Index(c *gin.Context) {
    //c.String(http.StatusOK, "Hello Web Api!")
    web.Success(c)
}

standard.go

package controller

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

type StandardController struct{}

func (standard StandardController) Success(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
       "status": 200,
    })
}

func (standard StandardController) Error(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
       "status": 500,
    })
}

7.4、main

package main

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

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

    app.AppApi(r)
    web.WebApi(r)

    err := r.Run()
    if err != nil {
       return
    }
}

7.5、go.mod

module ginstudy

go 1.20

require (
    dario.cat/mergo v1.0.0 // indirect
    github.com/bep/godartsass v1.2.0 // indirect
    github.com/bep/godartsass/v2 v2.0.0 // indirect
    github.com/bep/golibsass v1.1.1 // indirect
    github.com/bytedance/sonic v1.10.2 // indirect
    github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
    github.com/chenzhuoyu/iasm v0.9.1 // indirect
    github.com/cli/safeexec v1.0.1 // indirect
    github.com/cosmtrek/air v1.49.0 // indirect
    github.com/creack/pty v1.1.20 // indirect
    github.com/fatih/color v1.15.0 // indirect
    github.com/fsnotify/fsnotify v1.7.0 // indirect
    github.com/gabriel-vasile/mimetype v1.4.3 // indirect
    github.com/gin-contrib/sse v0.1.0 // indirect
    github.com/gin-gonic/gin v1.9.1 // indirect
    github.com/go-playground/locales v0.14.1 // indirect
    github.com/go-playground/universal-translator v0.18.1 // indirect
    github.com/go-playground/validator/v10 v10.16.0 // indirect
    github.com/goccy/go-json v0.10.2 // indirect
    github.com/gohugoio/hugo v0.120.3 // indirect
    github.com/json-iterator/go v1.1.12 // indirect
    github.com/klauspost/cpuid/v2 v2.2.5 // indirect
    github.com/leodido/go-urn v1.2.4 // indirect
    github.com/mattn/go-colorable v0.1.13 // indirect
    github.com/mattn/go-isatty v0.0.20 // indirect
    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
    github.com/modern-go/reflect2 v1.0.2 // indirect
    github.com/pelletier/go-toml v1.9.5 // indirect
    github.com/pelletier/go-toml/v2 v2.1.0 // indirect
    github.com/spf13/afero v1.10.0 // indirect
    github.com/tdewolff/parse/v2 v2.7.4 // indirect
    github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
    github.com/ugorji/go/codec v1.2.11 // indirect
    golang.org/x/arch v0.6.0 // indirect
    golang.org/x/crypto v0.14.0 // indirect
    golang.org/x/net v0.17.0 // indirect
    golang.org/x/sys v0.14.0 // indirect
    golang.org/x/text v0.14.0 // indirect
    google.golang.org/protobuf v1.31.0 // indirect
    gopkg.in/yaml.v3 v3.0.1 // indirect
)

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

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

相关文章

.NET Framework中自带的泛型委托Action

Action<>是.NET Framework中自带的泛型委托&#xff0c;可以接收一个或多个输入参数&#xff0c;但不返回任何参数&#xff0c;可传递至多16种不同类型的参数类型。在Linq的一些方法上使用的比较多。 1、Action泛型委托 .NET Framework为我们提供了多达16个参数的Action…

【网络安全 --- web服务器解析漏洞】IIS,Apache,Nginx中间件常见解析漏洞

一&#xff0c;工具及环境准备 以下都是超详细保姆级安装教程&#xff0c;缺什么安装什么即可&#xff08;提供镜像工具资源&#xff09; 1-1 VMware 16.0 安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客文章浏览阅读20…

【Linux】第十二站:进程

文章目录 1.windows和linux中的进程2.先描述3.在组织4.具体的Linux系统是如何做的&#xff1f;1.基本概念2.描述进程-PCB3.task_struct和PCB的关系4.task_struct内容分类5.linux具体如何做的&#xff1f;6.查看进程 1.windows和linux中的进程 一个已经加载到内存的程序&#xf…

洛谷P1102 A-B数对 详细解析及AC代码

P1102 A-B数对 前言题目题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码经典二分&#xff08;O(nlgn)&#xff09;酷炫哈希&#xff08;O(n)&#xff09; 后话额外测试用例样例输入 #2样例输出 #2 王婆卖瓜 题目来源 前言 酷&…

生成式人工智能的“经济学”,The Economic Case for Generative AI#a16z

a16z召集了行业精英&#xff0c;为我们带来了有关生成式AI的洞察。在创造力方面&#xff0c;生成式AI带来了3-4倍量级的成本优势&#xff0c;更多新的需求将诞生。 AI REVOLUTION The Economic Case for Generative AI Martin Casado MixCopilot 大家好&#xff0c;欢迎来到本期…

遇到python程序是通过sh文件启动的,如何调试

说明 下载的源码总会遇到这样启动的&#xff1a; 并且发现shell文件内容很多&#xff0c;比较复杂&#xff0c;比如&#xff1a; 解决方案 这时候想要调试&#xff0c;可以通过端口连接的方式调试&#xff0c;具体方法如下&#xff1a; 在vscode调试按钮中添加远程附加调试…

【kubernetes】pod的生命周期

文章目录 1、概述2、pod的生命期3、pod阶段4、容器状态5、容器重启策略6、pod状况6.1 Pod就绪态6.2 Pod就绪态的状态6.3 Pod网络就绪 7、容器探针7.1 检查机制7.2 探测结果7.3 探测类型 8、Pod的终止8.1 强制终止Pod8.2 Pod的垃圾收集 1、概述 pod遵循预定义的生命周期&#x…

【MogDB/openGauss误删未归档的xlog日志如何解决】

在使用MogDB/openGauss数据库的过程中&#xff0c;有时候大量业务&#xff0c;或者导数据会导致pg_xlog下的日志数量持续增长&#xff0c;此时如果xlog的产生频率太快&#xff0c;而来不及自动清理&#xff0c;极有可能造成pg_xlog目录的打满。如果对数据库的xlog不太了解的时候…

解决Java中https请求接口报错问题

1. 解决SSLException: Certificate for &#xff1c;域名&#xff1e; doesn‘t match any of the subject alternative报错问题 1.1 问题描述 最近在做一个智能问答客服项目&#xff0c;对接的是云问接口&#xff0c;然后云问接口对接使用的是https方式&#xff0c;之前一直…

git push超过100MB大文件失败(remote: fatal: pack exceeds maximum allowed size)

push代码的时候&#xff0c;有时会出现如下问题 remote: fatal: pack exceeds maximum allowed size error: failed to push some refs to ‘git.n.xiaomi.com:fuzheng1/nl2sql.git’ 解决方案&#xff1a; 将本地 http.postBuffer 数值调整到GitHub服务对应的单次上传大小配置…

凭什么不让使用外键!?

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 434 篇原创分享 作者 l Hollis 来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; MySQL 外键&#xff08;Foreign Key&#xff09;是用于建立表之间关系的&#xff0c;它定义了一个表中的一列或一组…

IDEA JAVA项目 导入JAR包,打JAR包 和 JAVA运行JAR命令提示没有主清单属性

一、导入JAR包 1、java项目在没有导入该jar包之前&#xff0c;如图&#xff1a;2、点击 File -> Project Structure&#xff08;快捷键 Ctrl Alt Shift s&#xff09;&#xff0c;点击Project Structure界面左侧的“Modules”如图&#xff1a;3.在 “Dependencies” 标签…

Javaweb之javascript的详细解析

JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过代码/js效果演示提供资料进行效果演示&…

使用Kotlin与Unirest库抓取音频文件的技术实践

目录 摘要 一、Kotlin与Unirest库概述 二、使用Kotlin和Unirest抓取音频文件 1、添加Unirest依赖 2、发送HTTP请求获取音频文件 3、保存音频文件 三、完整代码示例 四、注意事项 结论 摘要 本文详细阐述了如何使用Kotlin编程语言与Unirest库抓取网络上的音频文件。首…

kimera论文阅读

功能构成&#xff1a; Kimera包括四个关键模块: Kimera-VIO的核心是基于gtsam的VIO方法[45]&#xff0c;使用IMUpreintegration和无结构视觉因子[27]&#xff0c;并在EuRoC数据集上实现了最佳性能[19]; Kimera-RPGO:一种鲁棒姿态图优化(RPGO)方法&#xff0c;利用现代技术进…

伦敦金周末可以交易吗,黄金休市时间是那些?

伦敦金是国际性投资产品&#xff0c;主要交易中心有亚洲、欧洲和美洲&#xff0c;在时差的作用下&#xff0c;三大市场相互连接&#xff0c;形成了全天24小时几乎不间断的交易时间&#xff0c;也为炒金者们提供了充分的操作机会。即便如此&#xff0c;在一些特定的时间段内&…

springboot前后端时间类型传输

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

电脑发热发烫,具体硬件温度达到多少度才算异常?

环境&#xff1a; 联想E14 问题描述&#xff1a; 电脑发热发烫,具体硬件温度达到多少度才算异常? 解决方案&#xff1a; 电脑硬件的温度正常范围会因设备类型和使用的具体硬件而有所不同。一般来说&#xff0c;以下是各种硬件的正常温度范围&#xff1a; CPU&#xff1a;正…

【10套模拟】【2】

关键字&#xff1a; 哈希函数解决问题、进栈、无向图边与度、双向链表插入新结点、折半查找判定树ASL、孩子兄弟表示法、树变二叉、快排partiction划分

如何获取HuggingFace的Access Token;如何获取HuggingFace的API Key

Access Token通过编程方式向 HuggingFace 验证您的身份&#xff0c;允许应用程序执行由授予的权限范围&#xff08;读取、写入或管理&#xff09;指定的特定操作。您可以通过以下步骤获取&#xff1a; 1.首先&#xff0c;你需要注册一个 Hugging Face 账号。如果你已经有了账号…